吞吐性&&延时:
- buffer.memory:buffer设置大了有助于提升吞吐性,但是batch太大会增大延迟,可搭配linger_ms参数使用
- linger_ms:如果batch太大,或者producer qps不高,batch添加的会很慢,我们可以强制在linger_ms时间后发送batch数据
- ack:producer收到多少broker的答复才算真的发送成功
- 0表示producer无需等待leader的确认(吞吐最高、数据可靠性最差)
- 1代表需要leader确认写入它的本地log并立即确认
- -1/all 代表所有的ISR都完成后确认(吞吐最低、数据可靠性最高)
Sender线程和长连接
每初始化一个producer实例,都会初始化一个Sender实例,新增到broker的长连接。
代码角度:每初始化一次KafkaProducer,都赋一个空的client
- public KafkaProducer(final Map configs) {
- this(configs, null, null, null, null, null, Time.SYSTEM);
- }
终端查看TCP连接数:
- lsof -p portNum -np | grep TCP,适当增大producer数量能提升吞吐
Consumer设计原理
poll消息
- 消费者通过fetch线程拉消息(单线程)
- 消费者通过心跳线程来与broker发送心跳。超时会认为挂掉
- 每个consumer group在broker上都有一个coordnator来管理,消费者加入和退出,以及消费消息的位移都由coordnator处理。
位移管理
consumer的消息位移代表了当前group对topic-partition的消费进度,consumer宕机重启后可以继续从该offset开始消费。在kafka0.8之前,位移信息存放在zookeeper上,由于zookeeper不适合高并发的读写,新版本Kafka把位移信息当成消息,发往__consumers_offsets 这个topic所在的broker,__consumers_offsets默认有50个分区。消息的key 是groupId+topic_partition,value 是offset.
Kafka Group 状态
- Empty:初始状态,Group 没有任何成员,如果所有的 offsets 都过期的话就会变成 Dead
- PreparingRebalance:Group 正在准备进行 Rebalance
- AwaitingSync:Group 正在等待来 group leader 的 分配方案
- Stable:稳定的状态(Group is stable);
- Dead:Group 内已经没有成员,并且它的 Metadata 已经被移除
- 注意
重平衡reblance
当一些原因导致consumer对partition消费不再均匀时,kafka会自动执行reblance,使得consumer对partition的消费再次平衡。 (编辑:西安站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|