【问题标题】:How to handle bursts with Actors?如何处理与演员的爆发?
【发布时间】:2013-04-27 12:16:51
【问题描述】:

假设我有一个演员,它每秒处理X 请求。平均来说还可以,但有时会有突发,客户​​端每秒发送Y > X 请求。还假设所有请求都有超时,因此它们不能永远在队列中等待。

假设我们使用 Scala 和Akka 进行编程,让演员处理这些突发事件的最佳实践/设计模式是什么?有没有处理突发的代码示例?

【问题讨论】:

  • 是什么将参与者限制为每秒 X 个请求?

标签: scala concurrency akka actor


【解决方案1】:

只要您的机器能够处理增加的负载(即有足够的 CPU),那么我建议使用 Router 池化 Actor。从您的示例中听起来,动态调整大小的路由器可能是最合适的,但即使是标准的循环或最小邮箱也可能就足够了。下面是 Akka 文档中路由器部分的链接。我希望这会有所帮助。

http://doc.akka.io/docs/akka/2.1.2/scala/routing.html

您也可以考虑将参与者分布在多个节点上,但这对于您的场景来说可能是多余的。如果您对这种方法感兴趣,请告诉我,我可以发布更多关于这样做的背景信息。

现在,当您汇集演员但系统仍然积压后该怎么办,这真的取决于您,但这里有几个选项。如果您可以处理由于突发导致的偶尔增加的延迟,那么什么也不做。演员的邮箱只会得到一点备份,但一旦爆发缓解,它们就会清除。如果没有,那么问题是当参与者积压时如何处理传入的消息。如果您想在这种情况下快速失败并且不接受您可能希望使用有界邮箱 (http://doc.akka.io/docs/akka/2.1.2/scala/dispatchers.html) 的邮件。当邮箱达到它的大小限制并且不能再对消息进行排队时,调用者将发送消息失败(我认为)。不是很棒,但至少会导致系统更快地稳定下来。

我假设你正在做ask (?)(即请求/响应),所以当你这样做时,你会得到一个Future。如果Future 没有及时收到响应,它将超时(具有隐式定义的超时值),因此在突发期间,附加到对积压参与者的调用的期货将开始超时;他们不会永远被困在那里。

【讨论】:

  • 谢谢。我会考虑路由器。分布式(远程)演员超出了我的范围。现在假设机器超载并且没有更多的机器。如何正确处理突发事件?
  • 添加了更多信息。希望这会有所帮助。如果没有,请告诉我。
  • 这是一篇关于限制演员的有趣文章。认为这与这次讨论有关。 letitcrash.com/post/28901663062/throttling-messages-in-akka-2
猜你喜欢
  • 1970-01-01
  • 2013-10-21
  • 1970-01-01
  • 2013-10-04
  • 2011-03-16
  • 1970-01-01
  • 1970-01-01
  • 2013-05-19
相关资源
最近更新 更多