- 生产者(producer)
- 会分为两个线程一个双端队列(RecordAccumulator) 双端队列大小默认 32m
- 线程细节:
- 主线程主要执行 过滤器/序列化器/分区器 然后添加到双端队列中
- Sender线程 不断从队列中拉取数据发送到 broker
- Sender线程 默认每个broker节点最多缓存5个请求 Selector 应用 和 netty NIO
- 默认 达到批次大小 或者 到达指定时间后 发送请求
- batch.size 默认 16k
- linger.ms 单位ms 默认 0
- 双端队列细节
- buffer.memory 可设置双端队列的默认大小 默认 32m
- 线程细节:
- 序列化器
- key.serializer key序列化器 必须写全类名
- value.serializer value序列化器 必须写全类名
- 分区器
- 指定分区 ;
- 根据 key的hash值 取 主题的partition的数量 取模;
- 自定义分区 实现 partitioner 重现 partition 方法 返回分区数 ;
- 生产者参数配置:
- acks
- 0:生产者发送过来数据 ,不需要等待数据落盘应答。
- 1:生产者发送过来数据,需要等待leader数据落盘后应答。
- -1(all):生产者发送过来数据,需要等待leader及isr中的队列里面所有的节点数据收齐后应答。默认值是-1
- max.in.fight.request.per.connection:允许最多没有返回的ack的次数,默认为5,开启幂等性要保证该值是1-5的数字。
- retries:发送失败重试次数 默认值 Integer 的最大值 如果设置了重试,还想保证消息的有序性,需要设置 MAX_IN_FLIGHT_REQUESTS_PER_CONNECTION=1 否则在重试此失败消息的时候,其他的消息可能发送成功了。
- retry.backoff.ms:两次重试之间的时间间隔,默认是100ms。
- enable.idempotence:是否开启幂等性 默认true 开启。
- compression.type:生产者发送的所有数据的压缩方式,默认是none,也就是不压缩。支持的压缩方式:none,gzip,snappy,lz4和zstd;
- acks
- 生产者发送消息 优化
- 缓冲区大小 适当调大 32m -> 64m
- 批处理大小 适当调大 16k -> 32k
- 间隔时间调整 从0 -> 5
- 压缩方式调整 none -> snappy
- 生产经验 数据可靠性
- ack应答原理
- 0:生产者发送过来数据 ,不需要等待数据落盘应答。
- 1:生产者发送过来数据,需要等待leader数据落盘后应答。
- -1(all):生产者发送过来数据,需要等待leader及 ISR 里面所有的节点数据收齐后应答。默认值是-1
- 数据去重
- 至少一次(At Last Once) -> ack级别设置为-1 + 分区副本大于等于2 + ISR里应答的最小副本数量大于等于2;
- 最多一次(At Most Once) -> ack级别设置为 0
- 精确一次(Exactly Once) -> 数据不能重复也不能丢失 幂等性和事务;
- 幂等性
- Producer不管向Broker发送多少次重复数据,Broker端都只会持久化一条,保证了不重复;
- 重复数据的判断依据,具有<PID,Partition,SeqNumber>相同主键的消息提交时,Broker只会持久化一条,其中PID是Kafka每次重启都会分配一个新的,Partition表示分区号,Sequence Nnumber 是单调递增的;所以幂等性只能保证在单分区单会话内不重复;
- 开启幂等性 enable.idempotence 设置为 true;
- 生产者事务
- 开启事务必须开启幂等性。
- 幂等性
- 至少一次 可以保证数据不丢失,但是不能保证数据不重复;
- 最多一次 不能保证数据不丢失;
- 数据有序性
- 单分区内数据有序
- 多分区 分区与分区之间无序
- max.in.flight.requests.per.connection 生产者在收到服务器服务器相应之前还可以发送多少个消息
- 开启单分区有序的方法
- max.in.flight.requests.per.connection = 1 无需考虑是否开启幂等性
- max.in.flight.requests.per.connection 1-5 需要开启幂等性
- ack应答原理
- 会分为两个线程一个双端队列(RecordAccumulator) 双端队列大小默认 32m
KAFKA Producer 相关内容
最新推荐文章于 2024-06-21 17:13:04 发布