scala - 如何处理 Actor 的爆发?

标签 scala concurrency akka actor

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

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

最佳答案

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

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

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

现在,当你集中 Actor 但系统仍然积压时该怎么办,这实际上取决于你,但这里有一些选择。如果您可以处理由于突发而导致的延迟偶尔增加,则无需执行任何操作。 Actor 的邮箱只会得到一点备份,但一旦爆发减弱,它们就会清除。如果没有,那么问题是当参与者积压时如何处理传入消息。如果您想在这种情况下快速失败并且不接受消息,您可能需要使用有界邮箱( http://doc.akka.io/docs/akka/2.1.2/scala/dispatchers.html )进行研究。当邮箱达到其大小限制并且无法再对消息进行排队时,调用者将无法发送消息(我认为)。不算太棒,但至少会导致系统更快地稳定。

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

关于scala - 如何处理 Actor 的爆发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16252015/

相关文章:

scala - 在哪里可以下载 Akka 2.5.6 的库 .jar 文件?

multithreading - Iterator.continually : special proccessing for the first element

java - Collections.synchronizedSortedMap 与 ConcurrentSkipListMap 用于并发使用的排序映射

javascript - 是否可以利用跨域 iframe 进行非阻塞计算?

scala - 为什么 akka.jsr166y.ForkJoinPool 在 Akka 2.0.2 中被弃用?

scala - 在不关闭系统本身的情况下停止系统中的所有参与者?

json - 在 Scala 中使用什么 JSON 库?

Scala 提取器 - 跳过未使用的参数

perl - 在 Perl 中发出并发 Web 请求的最快方法是什么?

scala - 如何从 akka Source[ByteString, _] 中提取 Future[String]?