按需水平扩展事件驱动架构

问题描述

负载增加时水平扩展事件驱动架构的最佳方法是什么?

  1. 很多人建议使用 Kakfa 作为 EDA 的消息队列源 但是 Kafka 只允许一个消费者组中的每个消费者 划分。重新分区,尤其是在重负载情况下 可能既昂贵又耗时。
  2. 一个消费者群体中有许多消费者,他们接受工作和 快速承认会提供一些水平缩放,但现在 需要考虑消息顺序以及加载完成。
  3. 使用 RabbitMQ 可以动态创建和删除队列 这将需要一个额外的协调器来帮助管理和 分配负载

这些也没有解决地域带来的负载平衡问题。

任何帮助将不胜感激。谢谢

解决方法

回答有点晚,但在这里,

您认为缩放应该发生在消息总线层的推理并不完全正确。如果我们采用端到端方案,增加的负载意味着增加对前端(API 层)的传入请求。请参阅以下链接中的 reference 事件驱动架构。

假设存在某种形式的自动扩展(Kubernetes 复制因子、Amazon 自动扩展),前端将扩展以处理额外负载。在初始预处理之后,服务会将事件发布到事件驱动架构中的消息队列。

特别是在 Kafka 中,主题分区是一个扩展单元,因为一个生产者可以写入一个分区。通常您会根据单个分区的吞吐量预先定义分区数。

正如参考文献 article 提到的,如果单个分区吞吐量是 p 并且您需要 t 作为吞吐量,那么您需要 t/p > 分区。

如果 t 是正常预期负载的吞吐量,您可以通过创建尽可能多的分区来提前为 2x、3x、10x 吞吐量创建供应。

通常单个分区的吞吐量超过 10 Mb/s。