KIP-932:Kafka用作一个简单的队列

简单队列要求:
无消息排序要求

想使用Kafka作为一个简单的队列?

有了新的KIP-932:引入共享(消费者)群体

之前的Kafka消费者组
Kafka常规消费者组非常适合可伸缩性和保持消息顺序两种选择。

  • 保持消息顺序,排序要求迫使单个消费者独占访问一组分区
  • 如果追求可伸缩性,而不是消息先来后到的顺序,可以让消息走多个分区,但是这时还是一个消费者访问一个分区,不是多个消费者访问多个分区,可以说,隐藏的分区概念是Kafka挖的大坑。

而简单队列如RabbitMQ中多个消费者会共享一个队列,谁抢到就拿走,没有分区概念。

KIP-932:Kafka的新扩展引入 共享(消费者)群:

  • 共享组允许 many-to-many 分区→消费者之间多对多映射关系,多个消费者可以共享一个分区,也可以跨分区。
  • 不需要编写太多新代码--共享组可以使用Kafka消费者目前支持的完全相同的API运行,只是不同的配置(“group_type=share”)。
  • 共享组将整个主题视为单个队列。之前没有队列概念,以分区模糊性地替代了队列概念。
  • 所有消费者 读取 所有分区 , 没有粘性映射,不会消费者盯牢一个分区。

这允许您拥有一个具有额外Kafka优点的作业队列:

  •  无最大队列深度
  •  回放记录的能力
  • 这些队列有 至少一次 语义还有 没有顺序 .

现在你可以优雅地使用Kafka,就好像它是一个队列,而不改变任何底层的东西:


如何工作
broker将有一个新的组件来管理消费组:称为 共享组协调员 .

  • 它将为每个分区保留一个记录的滑动窗口,该窗口内的每个记录都可由共享组使用。这些称为 飞行记录.
  • 代理将跟踪该窗口中每条记录的处理状态,并将其提供给共享消费者。当消费者确认他们的消费时,窗口将逐步向前移动。
  • 一旦获取,记录将被标记为 收购 这个特定的消费者。它们被锁定最长为`share_record_lock_duration_ms`,这样如果消费者崩溃,消息就会被释放。
  • 然后,消费者可以确认/释放/拒绝消息:
  • ack -确认成功处理并移动共享组的偏移进度
  • 释放-处理不成功-重试。把唱片放出来再送一次。
  • 拒绝-处理不成功-中止。将记录列入黑名单,使其无法用于其他交付。
  • 毒药记录也被处理- 已取得但未处理的 消息被计数,直到最大值。之后,记录被标记为 存档 不再发送了

一句话,这项新功能提供了任意数量的消费者无序消费的可用性功能 .

请注意,这项提案尚待表决。