kafka生产者属性
参数 | 含义 |
acks | 发出消息持久化机制参数,它有下面几个属性 “all”, “-1”, “0”, “1” 默认值是all(all和-1是一样的) (1)acks=0:表示producer不需要等待任何broker确认收到消息的回复,就可以继续发送下一条消息。性能最高,但是最容易丢消息。(2)acks=1: 至少要等待leader已经成功将数据写入本地log,但是不需要等待所有follower是否成功写入。就可以继续发送下一 条消息。这种情况下,如果follower没有成功备份数据,而此时leader又挂掉,则消息会丢失。 (3)acks=-1或all: 需要等待 min.insync.replicas(默认为1,推荐配置大于等于2) 这个参数配置的副本个数都成功写入日志,这种策略会保证只要有一个备份存活就不会丢失数据。这是最强的数据保证。一般除非是金融级别,或跟钱打交道的场景才会使用这种配置。 |
retries | 生产者 发送消息重试次数 发送失败会重试,默认重试间隔100ms,重试能保证消息发送的可靠性,但是也可能造成消息重复发送,比如网络抖动,所以需要在 接收者那边做好消息接收的幂等性处理 ProducerConfig.RETRIES_CONFIG 重试次数 默认值Integer.MAX_VALUE |
retry.backoff.ms | 重试时间间隔 ProducerConfig.RETRY_BACKOFF_MS_CONFIG 重试时间间隔 |
enable.idempotence | 幂等,默认是true 生产者发送消息模式开启幂等,启用幂等要求max.in.flight.requests.per.connection小于或等于5(保留任何允许值的消息顺序),重试次数大于0,acks必须是’all’, 开启事务必须开启幂等,ProducerConfig.ENABLE_IDEMPOTENCE_CONFIG |
transactional.id | 默认值null,默认情况下,事务需要至少三个代理的集群,这是生产环境的推荐设置;对于开发,您可以通过调整代理设置transaction.state.log.replication.factor来改变这一点。如果没有提供TransactionalId,那么生产者将被限制为幂等交付,如果配置了事务,请启用事务 |
ProducerConfig.TRANSACTION_TIMEOUT_CONFIG | 事务的一个超时时间 60000 |
ProducerConfig.COMPRESSION_TYPE_CONFIG | 消息压缩:none、lz4、gzip、snappy,默认为 none。 |
buffer.memory | 设置发送消息的本地缓冲区,如果设置了该缓冲区,消息会先发送到本地缓冲区,可以提高消息发送性能,默认值是33554432,即32MB |
batch.size | kafka本地线程会从缓冲区取数据,批量发送到broker, 设置批量发送消息的大小,默认值是16384,即16kb,就是说一个batch满了16kb就发送出去 |
linger.ms | 这个在spring boot配置中需要配置在 properties属性map里, 默认值是0,意思就是消息必须立即被发送,但这样会影响性能, 一般设置10毫秒左右,就是说这个消息发送完后会进入本地的一个batch,如果10毫秒内,这个batch满了16kb就会随batch一起被发送出去, 如果10毫秒内,batch没满,那么也必须把消息发送出去,不能让消息的发送延迟时间太长 |
ProducerConfig.MAX_REQUEST_SIZE_CONFIG | 每条消息最大的大小 默认值 1024 * 1024,1M |
ProducerConfig.MAX_BLOCK_MS_CONFIG | KafkaProducer.send() 和 partitionsFor() 方法的最长阻塞时间 单位 ms 默认值 60 * 1000 |
ProducerConfig.CLIENT_ID_CONFIG | 客户端ID 默认值空 |
ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG | 把发送的key从字符串序列化为字节数组 |
ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG | 把发送消息value从字符串序列化为字节数组 |
ProducerConfig.PARTITIONER_CLASS_CONFIG | 分区策略 自定义分区器 |
kafka消费者属性
参数 | 含义 |
group.id | 消费分组名 |
enable.auto.commit | 是否自动提交offset,默认就是true |
auto.commit.interval.ms | 自动提交offset的时间间隔, 默认5s |
auto.offset.reset | 当消费主题的是一个新的消费组,或者指定offset的消费方式,offset不存在,那么应该如何消费 ; latest(默认) :只消费自己启动之后发送到主题的消息 earliest:第一次从头开始消费,以后按照消费offset记录继续消费,这个需要区别于consumer.seekToBeginning(每次都从头开始消费),none:如果未找到消费者组的先前偏移量,则向消费者抛出异常 |
heartbeat.interval.ms | consumer给broker发送心跳的间隔时间,默认时间3秒,broker接收到心跳如果此时有ebalance发生会通过心跳响应将rebalance方案下发给consumer,这个时间可以稍微短一点session.timeout.ms:默认45秒,服务端broker多久感知不到一个consumer心跳就认为他故障了,会将其踢出消费组, 对应的Partition也会被重新分配给其他consumer |
max.poll.records | 默认值500 一次poll最大拉取消息的条数,如果消费者处理速度很快,可以设置大点,如果处理速度一般,可以设置小点 |
max.poll.interval.ms | 默认300秒 如果两次poll操作间隔超过了这个时间,broker就会认为这个consumer处理能力太弱,会将其踢出消费组,将分区分配给别的consumer消费 |
ConsumerConfig.INTERCEPTOR_CLASSES_CONFIG | 设置Consumer拦截器 |
ConsumerConfig.REQUEST_TIMEOUT_MS_CONFIG | 请求超时 默认值30000 |
ConsumerConfig.PARTITION_ASSIGNMENT_STRATEGY_CONFIG | 消费分区分配策略,Range,RoundRobin,Sticky |
listenner监听配置
> ack-mode: 提交偏移量类型 listener: ack-mode
> # 当每一条记录被消费者监听器(ListenerConsumer)处理之后提交
> # RECORD
> # 当每一批poll()的数据被消费者监听器(ListenerConsumer)处理之后提交
> # BATCH
> # 当每一批poll()的数据被消费者监听器(ListenerConsumer)处理之后,距离上次提交时间大于TIME时提交
> # TIME
> # 当每一批poll()的数据被消费者监听器(ListenerConsumer)处理之后,被处理record数量大于等于COUNT时提交
> # COUNT
> # TIME | COUNT 有一个条件满足时提交
> # COUNT_TIME
> # 当每一批poll()的数据被消费者监听器(ListenerConsumer)处理之后, 手动调用Acknowledgment.acknowledge()后提交
> # MANUAL
> # 手动调用Acknowledgment.acknowledge()后立即提交
> # MANUAL_IMMEDIATE 一般开发中都会使用MANUAL_IMMEDIATE手动提交
>
> concurrency: 并发量 ,该值设置需要小于等于分区总数,如果大于分区数没有任何意思 也一样消费不到数据
>
> type:消费类型 batch: 批量消费 一次拉取多条数据 single: 单条数据消费 其中的ack_count
> 和ack_time 分别是在ack-mode 设置为COUT和TIME时的阈值, 如果ack-mode是Count
> ack-count设置为5 那么消费者实例会在没监听到五条数据时进行一次提交,如果消息数据小于5条是不会进行提交的
> 同样如果ack-mode是TIME ack-TIME设置5s 如果消费者消费到数据的5秒内
> 消费者实例暂停,再次启动消费者时,一样会消费到上一次数据,因为消费者会在消费到消息的5秒后进行offset提交 ```
> >MANUAL: 在处理完最后一次轮询的所有结果后,将队列排队,并在一次操作中提交偏移量。可以认为是在批处理结束时提交偏移量 MANUAL_IMMEDIATE:只要在侦听器线程上执行确认,就立即提交偏移。会在批量执行的时候逐一提交它们。