Akka 2:如何暂停处理消息?

Mal*_*lax 10 actor akka

在我使用Akka掌握Actor模型的过程中,会弹出许多问题.这是另一个.假设我们有一个Actor,由于某些业务逻辑或可用资源,它必须在给定时间内停止处理消息.可能发生这种情况的情况可能是:

  • 节流.可能有一个Actor发送电子邮件但被限制为每秒只发送一封电子邮件.

  • Actor可能会使用一些只能同时处理x-messages的系统.这可能是一个AsyncHttpClient,它有一个固定的线程池,我不想重载它.

  • 处理消息所需的某些外部资源不可用(读取:外部REST-API)

我的大脑很可能尚未准备演员,我只需要提示如何以演员的方式解决这些问题.

Rol*_*uhn 7

一般答案

Actor总是尽可能快地处理消息,其中处理意味着将它们从邮箱中取出并将它们传递给actor的行为.因此,行为就是您的答案所在的地方:在需要非名义行为的时间段内将其更改为更合适的地方.

节流

如果一个组件以低于生成的速率处理消息,则最终必须丢弃消息.要么使用有界邮箱,要么将经理放在前面,跟踪工人的进度,并在压力期间进入"回复否定结果"模式.

当演员想要限制自己的输出率时,请使用context.system.scheduler.

这应该回答你的前两点.

复苏

在所需资源不可用的期间,根据要求,您有两个选项:在内部排队消息,或进入"无序"应答模式.您还可以混合,即排队某些时间和空间限制,并在达到限制时失败.

进一步的考虑

始终保持演员处理的工作单元非常小,以至于演员可以在其延迟要求内作出反应.后者可以非常放松(不间断地运行几个小时)或非常严格(必须以kHz速率处理消息).