「Kafka应用」消费者
消费者
1. 消费者和消费者组
每一个消费者实例相当于一个消费者,而一个消费者必须存在于某个消费者组下,如果创建时不指定消费者组,则系统会默认创建一个。所以一个消费者组至少有一个消费者存在。
2. 分区和消费者组的分配(分区数:4)
为了实现更好的负载均衡,所以主题下可以配置多个分区,而每个分区中的数据内容不一样。对于消费者而言,一个分区只能被一个消费者组下的某一个消费者使用。
原因:
- 避免重复消费。因为通常来讲一个消费者组都是做同一件事,如果某个分区数据被一个组内的两个成员都消费过,则这份数据就被消费了两次。
- 方便记录消费位移。kafka记录消费位移是以主题-分区-消费者组为维度来记录的,这样即便是消费者数量发生变更,仍然可以计算出整个消费者对于某个分区消费的位移值。
注意:当消费者数量发生变化时,此前以分配好的分区会重新分配,在此期间所有消费者都不可用。
2.1 当消费者组数量为1
这种情况下,如果当前主题数据只被这一个消费者使用的话,4个分区和1个分区并没有太大区别。
2.2 当消费者组数量为2
2.3 当消费者组数量为4
这种情况下性能是最高的,每一个消费者对应一个分区。
2.4 当消费者组数量为5
当消费者数量大于分区数时,会有一个消费者始终得不到数据,造成浪费。
3. 消费者实例流程
- 配置消费者客户端参数(设置服务节点、消费者组等参数)
- 创建消费者实例
- 订阅主题
- 拉取数据并消费
- 提交位移(很重要,如果不提交会造成重复消费)
- 关闭消费者实例
4. 主题订阅与分区
消费者需指定一个主题进行订阅,才可以从对应主题获取到数据。
4.1 订阅方式
4.1.1 集合
常用的订阅方式是集合,这种方式明确指定订阅的主题列表(可同时订阅多个主题),其中任一主题生产者投递数据后都可以被当前消费者接收到。
4.1.2 正则
正则方式订阅主题,这种方式好处在于主题名按照一定规律进行新增时,消费者客户端代码不需进行调整即可实现订阅,方便做横向扩展。
4.2 订阅类型
订阅类型分为两类:「主题订阅」和「主题分区订阅」,其中主题订阅会接收主题下所有分区的数据,而后者则只会接收主题下指定分区的数据。
5. 位移提交
5.1 自动提交(默认方式)
5.1.1 参数
auto.commit = true
auto.commit.interval.ms = 5000 (自动提交间隔时间)
5.1.2 机制
自动提交为默认提交方式,消费者每隔一段时间就对已消费数据位移进行提交,此操作是在pool逻辑中实现的,在进行下一次数据拉取前会检查当前位移是否可以提交,如果可以就会提交上一轮的位移。
5.1.3 利弊
好处:代码中不需要处理提交逻辑,更美观简洁。
坏处:容易产生重复消费。因为是间隔提交,所以在已消费未提交这个时期发生宕机,那么当服务器恢复或再均衡之后,这段数据会被再次消费。
5.2 手动提交(同步)
5.2.1 按消费批次提交
默认无参,会提交所有分区已消费数据位移,在一次性拉取比较多的数据时,如果发生意外则会导致较多的数据被重复消费,所以此方式性能高但安全性较低。
5.2.2 按条件提交
可以指定分区参数,在程序逻辑中按照单条任务位移提交或指定分区位移提交。比如每消费一条数据就提交一次或按分区消费数据,在发生意外时尽可能的减少受影响的数据,此方式性能较低但安全性较高。
本作品采用《CC 协议》,转载必须注明作者和本文链接