我们正在使用 AtLeastOnceDelivery 持久演员。我们收到大量未经确认的消息,如果这个数字太大,这会导致 OutOfMemoryError。
有没有办法我们可以配置 AtLeastOnceDelivery 演员将未确认的消息保存在磁盘上,而不是将它们全部保存在内存中,直到它们被确认?
或者更好的是有没有绕过这个限制的 AtLeastOnceDelivery 的替代品?
我们正在使用 AtLeastOnceDelivery 持久演员。我们收到大量未经确认的消息,如果这个数字太大,这会导致 OutOfMemoryError。
有没有办法我们可以配置 AtLeastOnceDelivery 演员将未确认的消息保存在磁盘上,而不是将它们全部保存在内存中,直到它们被确认?
或者更好的是有没有绕过这个限制的 AtLeastOnceDelivery 的替代品?
没有办法将AtLeastOnceDelivery
trait 调整为仅保留在磁盘上而不将信息保存在内存中。AtLeastOnceDelivery
遵循与持久化参与者类似的语义:可交付的消息被备份到 Akka 持久化后端并保存在内存中以便快速访问。内存存储被硬编码为 trait。
如果您无法将内存使用量保持在界限内,也许您应该调查为什么会发生这种情况以及如何解决它。在我看来,不断耗尽内存的参与者没有足够快地对其消息传递做出响应,因此可交付的工作不断堆积。
您可以尝试一些技巧来加快消息处理速度。您可以尝试优化消息处理中的各个组件以加快速度,或者您可以尝试使用Router actor等技术并行化消息处理。但是,有时这些技巧可能不足以使处理速度足够快,这时您需要考虑控制如何将消息带到 actor 进行处理。
您可以让 Actor 拉取工作,而不是让Actor 接受所有来自它的消息。有很多方法可以实现这种模式,但它们有一个共同的前提:不是直接将所有消息转储到 Actor 上,而是将消息存储到数据库(或可以处理大量数据的东西),然后让 worker演员尽可能快地提取和处理存储的消息。我认为该模式没有很多现成的解决方案,因此您可能需要自己做一些工作来实现该解决方案。