Kafka可用作队列模型了

banq

Kafka 一直在更新,推出了很多强大的新功能。
在 4.0 版本中,Kafka 开始变得更像一个队列了!
虽然很多东西在变,但有些东西还是老样子

Kafka 在处理大量数据时表现特别好:
• 一条消息可以被多个接收者多次读取
• 消息的顺序很重要
• 消息可以重复读取也很重要

但是,当 Kafka 尝试处理更适合队列系统的任务时,比如任务协调,它就不太行了:
• 比如每条记录都需要精细的确认

像任务分配这种情况,消费者收到消息、执行任务然后存档,用 Kafka 来实现就比较麻烦。


还有一个问题是消费者和分区的数量是绑定的。

同一个组里的两个消费者不能从同一个分区读取数据,所以如果你有 5 个分区,你就不能有超过 5 个消费者。‍♂️
为了解决这个问题,你可能需要设置过多的分区,但如果你不关心消息的顺序,也不需要扩展性,这样做就太浪费了。(就像任务队列一样)

KIP-932 解决了这个问题。
简单来说,它支持:
✅ - 多个消费者可以从同一个分区读取数据
✅ - 每条记录都可以单独确认
✅ - 生产者和消费者还是分开的
✅ - 没有最大队列大小限制
✅ - 消息还是会被保留,所以你可以重新读取

它是怎么做到的呢?
通过共享消费者组。✨

每个代理都是它负责的分区的共享组协调器。它管理消费者之间的读取“共享”。

它会为每个分区和组保留一个滑动窗口,记录开始(SPSO)和结束偏移(SPEO)。

可用的记录仅限于这个偏移范围内的记录,这样就限制了最快和最慢消费者之间的最大差距。✋

比如,group-1 可以读取 topic-A-partition-1 偏移量在 50-100 之间的内容

来自同一个共享组的消费者可以通过限时获取锁,在分区中独占保留一些记录(偏移范围),然后从同一个分区读取。

然后消费者可以确认/发布/拒绝这条消息:
- ack - 确认处理成功,并向前移动共享组的偏移量
- 释放(处理不成功)- 重试。释放记录,让另一个消费者重试
- 拒绝(处理不成功)- 中止。将记录列入黑名单,其他消费者不能使用
☠️为了避免毒害消息 - 每条消息都会记录一个传递次数。当超过最大重试次数时,这条消息就会被拒绝。

简单来说,这是一个让任意数量的消费者可以无序消费的可用性功能。


注意 KIP-932 有以下限制:
- 不能保证顺序。分区内的消息可能会无序传递。
— 还不能做到恰好一次 — 只能做到至少一次。
- 存在间接的最大处理增量。消费者不能读取组中最慢消息之前的 N 条以上消息。