如何正确使用Akka的事件流?

mig*_*uel 6 scala akka playframework

我一直在Play应用程序中使用Akka的事件流作为事件总线,我可以发布事件和订阅听众,我想知道我应该考虑的问题是什么.具体来说有两件事:

  • 每个监听器都是通过一个接收已发布事件并处理它们的actor来实现的.如果演员的消息队列开始变大怎么办?如何安全地实施背压,保证最终处理每个事件?
  • 与前一个相关:如何保留未处理的事件,如果失败,应用程序可以再次启动并处理它们?我知道akka-persistence的存在但是我不确定在这种情况下这是否是正确的做法:监听器演员不是有状态的,他们不需要重播过去的事件,我只是想要存储未处理的事件,并在处理完毕后删除它们.

小智 2

考虑到限制,我不会将 Akka 的事件总线用于此目的。

主要原因有:

  1. 交付- 您无法保证事件侦听器实际上正在侦听(无 ACK)。途中可能会丢失一些事件。
  2. 持久性- 没有内置的方法来保存事件总线状态。
  3. 扩展- Akka 的事件总线是本地设施,这意味着如果将来您想创建集群,它不适合。

处理这个问题最简单的方法是使用消息队列,例如 RabbitMQ。回来时我正在使用sstone/amqp-client。MQ 可以为您提供持久队列(每个侦听器/侦听器类型的队列)。