假设我有一个actor,每秒处理X
个请求。它平均可以,但有时会有突发,客户端每秒发送Y > X
个请求。假设所有请求都有超时,因此他们不能永远等待队列。
假设我们在Scala和Akka
中编程以使演员处理这些突发的最佳实践/设计模式是什么?有没有处理突发的代码示例?
答案 0 :(得分:2)
只要你的机器可以处理增加的负载(即有足够的CPU),我建议使用Actor
汇集Router
。听起来像你的例子,动态调整大小的路由器可能是最合适的,但即使是标准的Round Robin或Smallest Mailbox也足够了。以下是Akka文档中路由器部分的链接。我希望这会有所帮助。
http://doc.akka.io/docs/akka/2.1.2/scala/routing.html
您还可以考虑在多个节点之间分配actor,但这对您的场景可能过度。如果您对这种方法感兴趣,请告诉我,我可以发布更多相关内容。
现在,尽管你在集合演员之后该怎么做但系统仍然正在积压,这真的取决于你,但这里有一些选择。如果您可以处理由于爆发而偶尔增加的延迟,那么什么也不做。演员邮箱只会稍微备份,但一旦爆发缓解,他们就会清除。如果没有,那么问题是当演员被积压时如何处理传入的消息。如果您想在这种情况下快速失败并且不接受您可能希望使用有界邮箱(http://doc.akka.io/docs/akka/2.1.2/scala/dispatchers.html)查看的消息。当邮箱达到其大小限制并且不再对邮件进行排队时,调用者将发送邮件失败(我认为)。不是很棒,但至少会导致系统更快稳定。
我假设你正在做ask (?)
(即请求/响应),所以当你这样做时,你会得到一个Future
。如果Future
没有及时收到响应,那么{{1}}将超时(使用隐式定义的超时值),因此在突发期间,附加到积压演员的调用的Futures将开始超时;他们不会永远被困在那里。