Kafka 中的许多小队列 - 如何维护横向扩展负载平衡?

Many small queues in Kafka - how to maintain scale-out load-balancing?

我正在使用 Kafka 构建消息分发系统。它将每秒处理数万个事件(所有事件都是统一的结构),并将有数千个可能的接收者。消息将到达系统,在 Kafka 中排队,然后发送给接收者。要求是:

作为 Kafka 的新手,我不确定如何对其建模。起初我想每个收件人 一个主题 ,每个主题一个分区。我知道 Kafka 2.0 可以支持无限数量的主题,所以这不是问题。

这听起来像是消费者群体的机制。所以我正在研究每个收件人一个分区。在 Kafka 中,每个分区都是它自己的队列,可以按照自己的节奏进行,分区会自动分发并在消费者组中的消费者之间分配,这正是我所需要的!但分区的问题在于它们是一种数据流的负载平衡机制,因此它们有一些限制。

这个排队问题应该怎么用Kafka解决?或者也许 Kafka 不是这项工作的正确工具?

我认为 Kafka 不适合此类用例。它不是为大量队列和下游消费者设计的。它还依赖于基于时间的保留,这在消费者长时间停机时效果不佳。

我建议研究 Cadence Workflow 来实施您的应用程序。

与使用队列进行任务处理相比,Cadence 提供了许多其他优势。

  • 动态创建的任务队列。排队人数不限
  • 构建了具有无限到期间隔的指数重试
  • 故障处理。例如,如果在配置的时间间隔内两次更新均未成功,它允许执行通知另一项服务的任务。
  • 支持长运行心跳操作
  • 能够实现复杂的任务依赖关系。例如,在发生不可恢复的故障时实现调用链或补偿逻辑 (SAGA)
  • 提供对当前更新状态的完整可见性。例如,当使用队列时,您知道队列中是否有一些消息,并且您需要额外的数据库来跟踪整体进度。使用 Cadence,每个事件都会被记录下来。
  • 能够在飞行中取消更新。

参见 the presentation 介绍 Cadence 编程模型。