「Kafka应用」消费者

消费者

1. 消费者和消费者组

每一个消费者实例相当于一个消费者,而一个消费者必须存在于某个消费者组下,如果创建时不指定消费者组,则系统会默认创建一个。所以一个消费者组至少有一个消费者存在。

2. 分区和消费者组的分配(分区数:4)

为了实现更好的负载均衡,所以主题下可以配置多个分区,而每个分区中的数据内容不一样。对于消费者而言,一个分区只能被一个消费者组下的某一个消费者使用。
原因:

  1. 避免重复消费。因为通常来讲一个消费者组都是做同一件事,如果某个分区数据被一个组内的两个成员都消费过,则这份数据就被消费了两次。
  2. 方便记录消费位移。kafka记录消费位移是以主题-分区-消费者组为维度来记录的,这样即便是消费者数量发生变更,仍然可以计算出整个消费者对于某个分区消费的位移值。

注意:当消费者数量发生变化时,此前以分配好的分区会重新分配,在此期间所有消费者都不可用。

2.1 当消费者组数量为1

这种情况下,如果当前主题数据只被这一个消费者使用的话,4个分区和1个分区并没有太大区别。
image

2.2 当消费者组数量为2

image

2.3 当消费者组数量为4

这种情况下性能是最高的,每一个消费者对应一个分区。
image

2.4 当消费者组数量为5

当消费者数量大于分区数时,会有一个消费者始终得不到数据,造成浪费。
image

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 协议》,转载必须注明作者和本文链接
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!