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:只要在侦听器线程上执行确认,就立即提交偏移。会在批量执行的时候逐一提交它们。