这里以消息的发布订阅模式场景进行说明,暂不考虑广播模式。

一个topic可以划分为多个partition,有助于提高消息处理的并行效率。总体来说,一个消费者组内,一个消费者和一个partition的关系是1:N的关系,及一个消费者可以消费一个或多个partition,在同一时刻,一个partition只能被一个消费者消费。

1. 消费者和消费者组的关系

消费者属于消费者组,多个消费者组成一个消费者组。

kafka消费端确保一个 Partition 在一个消费者组内只能被一个消费者消费

  1. 在同一个消费者组内,一个 Partition 只能被一个消费者消费。
  2. 在同一个消费者组内,所有消费者组合起来必定可以消费一个 Topic 下的所有 Partition。
  3. 在同一个消费组内,一个消费者可以消费多个 Partition 的信息。
  4. 在不同消费者组内,同一个分区可以被多个消费者消费。
  5. 每个消费者组一定会完整消费一个 Topic 下的所有 Partition。

2. 消费者组的应用场景

  1. 在电商支付业务场景中,对于同一个Topic的消息,比如一笔订单支付,有多个消费场景需要根据这个支付消息进行对应的处理,比如平台的当日交易订单数,当日交易金额,累计交易订单数,累计交易金额等,对应商户,存在商户的当日交易单数,当日交易金额等,此时可以通过不同的消费者组来重复消费订单支付消息。
  2. 消费组与 Partition 的消费进度绑定。当有新的消费者加入或者有消费者从消费组退出时,会触发消费组的 Repartition 操作;在 Repartition 前,Partition1 被消费组的消费者 A 进行消费,Repartition 后,Partition1 消费组的消费者 B 进行消费,为了避免消息被重复消费,需要从消费组记录的 Partition 消费进度读取当前消费到的位置(即 OffSet 位置),然后在继续消费,从而达到消费者的平滑迁移,同时也提高了系统的可用性。

3. Repartition 触发时机

  1. 消费组内某消费者宕机,触发 Repartition 操作
  2. 消费组内新增消费者,触发 Repartition 操作
  3. Topic 下的 Partition 增多,触发 Repartition 操作

总的来说,就是只要partition和消费者有增减变化时,就会触发Repartition,即重新分配消费者与partition的对应关系。

4. 消费端工作流程

消费端使用消费者配置管理创建出了消费者连接器,通过消费者连接器创建队列(这个队列的作用也是为了缓存数据),其中队列中的消息由专门的拉取线程从服务端拉取然后写入,最后由消费者客户端轮询队列中的消息进行消费。

5. 消费者的三种消费情况

消费者从服务端的 Partition 上拉取到消息,消费消息有三种情况,分别如下:

  1. 至少一次。即一条消息至少被消费一次,消息不可能丢失,但是可能会被重复消费。通常是由于先进行消息消费了,保存偏移量时失败了。
  2. 至多一次。即一条消息最多可以被消费一次,消息不可能被重复消费,但是消息有可能丢失。通常是由于先保存了偏移量,消息消费失败了。
  3. 正好一次。即一条消息正好被消费一次,消息不可能丢失也不可能被重复消费。需要确保消息消费和保存偏移量能够同时成功。
     
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐