0

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

ActorA获取一条消息a,创建数十条b消息由 Actor 处理B(可能是多个实例,用于负载平衡),c为 Actor 生成多条消息C,等等。

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

我有以下要求:

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

我是消息总线技术的新手,但从我所读到的内容来看,这些要求在我看来就像“消息总线”提供的东西,如 RabbitMQ、Kafka、Kestrel,但我也看到 akka 也提供了一些持久性方法。我的问题是,考虑到各种可能性,我不知道该使用哪种技术。我读到像 Kafka 这样的东西对我的应用程序来说可能是一种过度杀伤力。但我也不确定 akka 持久性是否能满足我的两个要求(尤其是可扩展性)。

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

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

4

1 回答 1

0

像 RabbitMQ 这样的消息总线(通常称为消息代理)可以“开箱即用”处理您在问题中描述的所有消息传递机制。具体来说:

RabbitMQ 具有“开箱即用”的能力:

  • 传递消息而不重复消息。
  • 扩展系统并添加日志记录并拥有您描述的统计信息。
于 2015-07-23T14:18:12.777 回答