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

时间:2015-05-15 04:15:32

标签: scala playframework akka

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

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

1 个答案:

答案 0 :(得分:2)

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

主要原因是:

  1. 投放 - 您无法保证事件侦听器实际上正在侦听(无ACK)。在途中可能会丢失一些事件。
  2. 持久性 - 没有保留事件总线状态的内置方法。
  3. 扩展 - Akka的活动总线是本地设施,这意味着如果将来您想要创建群集,它将不合适。
  4. 最简单的处理方法是使用RabbitMQ等消息队列。 回来的时候我正在使用sstone/amqp-client。 MQ可以为您提供持久队列(每个侦听器/侦听器类型的队列)。