kafka学习:consumer消息

kafka学习:consumer消息

由于历史原因,我们公司用的还是比较老的kafka版本0.10.1.0,最近由于项目需要,学习了kafka的使用,学习过程中了解到的一些知识记录下,以便日后查阅;

写这篇文章时,主要带着这么几个疑问开始的:

  • consumer如何加入group的?
  • 分区消费平衡怎么做的?
  • consumer消费的offset如何指定的?
  • consumer提交的offset如何保存的?

1.consumer加入消费组group

kafka学习:consumer消息_第1张图片

  • JoinGroup
    所有的consumer都会向coordinate发送JOIN_GOUP请求;
    coordinate: consumer通过向broker发送METADATA请求,获取coordinate地址,coordinator由特定的kafka broker担任;
  • 选举consumer leader
    coordinate会选择一个consumer当做consumer group的leader,并将组成员通知leader consumer1, 并告知所有consumer它们的leader是consumer1;
  • 制定分区消费方案
    consumer1作为leader, 制作分区消费方案,并通知coordinate, 由coordinate同步分区消费方案给其他consumer;

2. consumer分区消费策略

不管分区策略如何,kafka规定同一个consumer group下,一个partition只能被一个consumer消费;

2.1 range策略

其实就是按段分配的意思,如图:
kafka学习:consumer消息_第2张图片

按段分配时,如果分区数与consumer客户端数不能整除,则前面的consumer会获取更多的分区;

2.2 roundbin策略

其实就是轮询分配的意思,如图:

kafka学习:consumer消息_第3张图片

3.consumer消费时offset指定

一般我们创建消费者时都是使用的已经封装好的客户端,这些客户端只需要我们创建时配置“从最早记录消费”、“从最新记录消费”、“从上次提交的offset处消费”,而接下来消费消息都不需要指定消费位置信息了,不过,这只不过是客户端已经帮我们封装好了而已,实际客户端每次获取消息都需要指定offset, 客户端每次获取一条消息后,offset自动加1处理了;

4. consumer重要参数

  • session.timeout.ms
    consumer group检测成员崩溃的时间;
  • max.poll.interval.ms
    consumer处理逻辑最大时间, 两次poll间时间超过该值,则认为consumer消费进度跟不上,该consumer会被踢出组,该consumer消费的分区会被rebalance给其他consumer;
  • heartbeat.interval.ms
    consumer的心跳间隔,以及coordinate将rebalance信息通过心跳respone返回给consumer;
  • fetch.max.bytes
    consumer单次获取数据的最大字节数;
  • max.poll.records
    单次poll消息最大消息数目;

5. consumer group offset

kafka broker保存consumer group 的offset信息,在服务端创建了__comsumer_offsets[0~49]的50个目录,该目录下保存了日志文件(.log)和索引文件(.index和.timeindex);

日志文件里记录了:(groupid) + (topic-parition) + offset;

每次offset更新时都会插入一条新记录,只不过kakfa会定期压缩消息,即只保存最新的offset记录;

你可能感兴趣的:(kafka,kafka,consumer)