akka.net - 如何限制Akka.net系统的内存消耗?

标签 akka.net

我们有一个使用 Akka.net 处理消息的 Windows 服务。具体来说,我们有 10 个相同的私有(private) MSMQ 队列和 10 个协调参与者。我们分配每个参与者处理一个队列,并将结果消息发送给 10 个子工作参与者(使用循环路由器)以插入到数据库中。随着私有(private)队列中消息数量的增加,子参与者无法跟上。内存消耗的增长速度与发送的消息数量一样快。我们有两个问题:

  1. 如何限制内存增长?我们能否监控 child Actor 收件箱以确保我们不会重载。

  2. 1 个协调 Actor 创建 10 个工作 Actor ,因此我们总共有 100 个 child 工作 Actor 。它是否正确?

最佳答案

我认为这里的问题不是内存消耗,而是工作流程本身的方法。

根据您所说的,我可以假设您正在从 MSMQ 中提取消息,立即将它们转发给工作人员,然后提取更多数据,而无需等待工作人员实际完成其工作。这是基于推送的数据流的传统问题,没有附加反压机制。

解决这个问题的最简单的方法是将数据流更改为基于拉取的模型 - 在这种情况下,协调器参与者不会尝试从 MSMQ 中提取数据,除非其中一个工作人员通知他们已完成他们的工作并正在等待更多数据(在这种情况下,您也不需要将它们放在路由器后面)。通知可以表示为工作进程完成当前消息处理后发送的消息。该模型的缺点是您将有空闲工作人员等待选择 MSMQ 消息。

更高级的概念包括需求驱动模型(背压),它可以利用消息缓冲 - 因此您可以提前预取一些数据,然后在处理时重新填充它。这样,在等待协调器从队列中选取下一条消息时,工作人员就不会保持空闲状态。您可以阅读更多有关背压概念背后的想法 here .

PS:一旦 Akka.Streams 模块推出,您将获得与内置背压原理配合使用的内置机制。

关于akka.net - 如何限制Akka.net系统的内存消耗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36947555/

相关文章:

c# - Akka 网络集成测试

testing - 如何使用 akka.net testkit 期待一些消息并忽略其他消息?

akka.net - 集群路由器组的 HOCON 格式?

c# - 如何在 Akka.NET 中使用 TestKit

c# - 在 Akka.NET 中测试 self 消息发送

akka.net - 如何为 akka.net 启用消息持久性

akka.net - Akka.Cluster 的端口耗尽问题

logging - 如何在 Akka.NET 中禁用集群心跳日志记录

azure - azure 中是否有断路器模式的 native 实现?