Akka Persistence - AtLeastOnceDelivery:如何在不耗尽内存的情况下获取无限数量的未确认消息

时间:2016-08-09 11:43:04

标签: akka akka-persistence

我们正在使用AtLeastOnceDelivery持久性actor。我们收到大量未经证实的消息,如果此数字太大,则会导致OutOfMemoryError。

我们是否可以配置AtLeastOnceDelivery actor以将未经确认的消息保留在磁盘上,而不是将它们全部保留在内存中,直到确认它们为止?

或者更好的是AtleastOnceDelivery可以替代这种限制吗?

1 个答案:

答案 0 :(得分:0)

无法将AtLeastOnceDelivery特征调整为仅保留在磁盘上而不将信息保留在内存中。 AtLeastOnceDelivery遵循与持久性actor相似的语义:可交付的消息被备份到Akka持久性后端并保存在内存中以便快速访问。内存存储为hardcoded to the trait

如果您无法将内存使用限制在界限中,或许您应该调查为什么会发生这种情况以及如何解决它。在我看来,持续耗尽内存的演员没有足够快地响应其消息传递,因此可交付的工作不断堆积。

您可以尝试一些技巧来加快邮件处理速度。您可以尝试优化消息处理中的各个组件,或者您可以尝试使用Router actor等技术并行化消息处理。但是,有时候这些技巧可能不足以让处理速度足够快,这时你需要考虑控制如何将消息带给actor进行处理。

而不是演员接受来自它的所有消息,而是make the actor pull the work。有许多方法可以实现这种模式,但它们有一个共同的前提:不是直接将所有消息转储到actor上,而是将消息存储到数据库(或者可以处理大量数据的东西),然后让工作者演员们尽可能快地拉动并处理存储的消息。我不认为该模式有许多现成的解决方案,因此您可能需要自己动手实施该解决方案。