我有一个javaweb服务,我将在scala中从头开始重新实现它。我有一个基于演员的新代码设计,大约有10-20个演员。其中一个用例有如下流程:
演员 A
获取消息 a
,创建数十个 b
要由参与者处理的消息 B
(可能是多个示例,用于负载平衡),生成多个 c
给参与者的消息 C
,等等。
在上面的场景中,一条消息 a
可能会导致几千条信息被来回发送,但我预计不会超过一把 a
一天一条消息(是的,目前不是很忙)。
我有以下要求:
信息不应丢失或重复。我的意思是,如果系统是在处理b消息的过程中重新启动的,那么在重新启动之后,应该提取未处理的消息。另一方面,经过处理的消息不应该再被获取(这些消息最终将启动一些大的计算,重复它们是昂贵的)。
它应该易于扩展。我的意思是在将来,我可能想在系统中添加一些其他组件,这些组件可以读取所有通信(或部分通信),例如记录发生的事情,或者统计处理了多少条b消息,或者对b消息做一些新的处理(紧挨着已经发生的事情),请注意,这些“组件”可以是用其他语言编写的独立应用程序。
我对消息总线技术还很陌生,但从我所读到的内容来看,这些要求听起来像“消息总线”提供的东西,比如rabbitmq、kafka、kestrel,但我也看到akka也提供了一些持久性的方法。我的问题是,考虑到巨大的可能性,我不知道该用哪种技术。我读到像Kafka这样的东西对我的申请来说可能是一种过度的杀伤力。但是我也不确定akka持久性是否满足了我的两个需求(特别是扩展性)。
我的问题是:我应该选择企业消息总线吗?像Kafka?或者像阿克卡这样的坚持会怎么样?或者,如果我自己实现一些东西(比如说,支持amqp以允许扩展性),会更快更合适吗?
当然,如果您知道符合此目的的东西,也欢迎您提出具体的技术建议。
1条答案
按热度按时间ni65a41a1#
像rabbitmq这样的消息总线(通常称为消息代理)可以“开箱即用”地处理您在问题中描述的所有消息传递机制。明确地:
rabbitmq具有“开箱即用”的能力:
传递信息而不重复信息。
扩展系统,添加日志记录,并具有您所描述的统计信息。