使用消息总线替代参与者之间的常规消息传递(例如,在 Scala 中)

Using message bus as replacement for regular message passing between actors (e.g., in scala)

我有一个 Java 网络服务,我将在 Scala 中从头开始重新实现它。我有一个基于演员的新代码设计,大约有 10-20 个演员。其中一个用例的流程如下:

Actor A gets a message a, creates tens of b messages to be handled by Actor B (possibly multiple instances, for load balancing), producing multiple c messages for Actor C, and so on.

在上面的场景中,一条消息 a 可能会导致几千条消息来回发送,但我预计一天不会超过几条 a 条消息(是的,目前不忙。

我有以下要求:

  1. 消息不应丢失或重复。我的意思是如果系统在处理 b 消息的过程中重新启动,则未处理的消息应该在重新启动后被拾取。另一方面,处理过的消息不应该被再次获取(这些消息最终会开始一些大的计算,重复它们是昂贵的)。
  2. 它应该易于扩展。我的意思是在未来,我可能想在系统中添加一些其他组件来读取所有通信(或部分通信),例如记录发生的事情,或者计算处理了多少 b 消息,或者用 b 消息做一些新的事情(在已经发生的事情旁边)等。请注意,这些 "components" 可以是用其他语言编写的独立应用程序。

我是消息总线技术的新手,但据我所读,这些要求对我来说就像 "message buses" 提供的,如 RabbitMQ、Kafka、Kestrel,但我还看到 akka 也提供了一些坚持的意思。 我的问题是,考虑到各种可能性,我不知道该使用哪种技术。我读到像 Kafka 这样的东西对我的应用程序来说可能是一种矫枉过正。但是我也不确定akka persistence是否满足了我的两个要求(尤其是可扩展性)。

我的问题是:我应该选择企业消息总线吗?像卡夫卡这样的东西?或者像 akka persistence 这样的东西会起作用吗? 或者,如果我自己实现一些东西(例如支持 AMQP 以允许扩展),它会更快更合适吗?

当然,如果您知道适合此目的的东西,也欢迎提供具体的技术建议。

像 RabbitMQ 这样的消息总线(通常称为消息代理)可以处理 "out of the box" 您在问题中描述的所有消息传递机制。具体来说:

RabbitMQ 有能力 "Out of the Box":

  • 传递消息而不重复消息。
  • 扩展系统并添加日志记录并获得您描述的统计信息。