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

时间:2016-04-29 21:15:30

标签: akka.net

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

  1. 如何限制内存增长?我们是否可以监控儿童演员收件箱,以确保我们不会超载它。

  2. 1个协调员演员创建了10个工人演员,所以我们共有100个童工演员。它是否正确?

1 个答案:

答案 0 :(得分:2)

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

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

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

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

PS:一旦Akka.Streams模块出现,您将获得内置机制,该机制适用于内置的背压原理。