阿卡演员故意封锁

时间:2014-10-28 03:24:49

标签: akka akka-supervision

据我所知,Akka演员不应该阻止以保持对消息的反应,但是如何构建我的服务来监视一个无限期运行的进程呢?

例如,我们使用的是Amazon Kinesis Connector库。您创建一个具有给定配置的连接器,该连接器继承自Runnable,然后调用Run()方法。连接器只是无限期地运行,从Kinesis中提取数据,并将其写入Amazon S3。实际上,如果runnable返回,那么这是一个错误,需要重新启动。

方法(1)将简单地为每个运行的Kinesis Connector创建一个子actor,如果Run()方法返回,则抛出异常,监督Actor会注意到异常并重新启动子actor。每个线程每个子actor的一个连接器。

方法(2)将用于子actor将Kinesis Connector包装在Future中,如果将来返回,则actor将在另一个Future中重新启动Connector。可以想象,单个actor可以管理多个连接器,但这是否意味着每个Future都在一个单独的线程中执行?

哪种方法最符合Akka的理念,还是人们推荐其他方法?一般情况下,我想捕获任何连接器的任何问题,并重新启动它。总共不会有超过六个连接器并行运行。

2 个答案:

答案 0 :(得分:5)

我会采用方法1.应该注意的是,虽然默认情况下actor没有专用线程,但它们共享一个线程池(所谓的调度程序,请参阅:http://doc.akka.io/docs/akka/2.3.6/scala/dispatchers.html)。这意味着阻塞本质上是危险的,因为它耗尽了池的线程而不让其他非阻塞的actor运行(因为被阻塞的actor没有将线程放回池中)。因此,您应该将阻塞调用分成固定大小的专用actor池,并且应该为这些actor分配一个PinnedDispatcher。后一步骤确保这些参与者不会相互干扰(他们每个人都有一个专用线程),并确保这些参与者不会干扰系统的其余部分(所有其他参与者将在另一个调度员上运行,通常是默认情况下-dispatcher)。请确保限制在PinnedDispatcher上运行的actor的数量,因为使用的线程数将随着该调度程序上的actor数量而增长。

答案 1 :(得分:1)

在你的两个选项中,我会说1更合适。 No.2的事实是,为了退出未来monad的世界,你需要在某处调用Await,在那里你需要指定一个最大持续时间,在你的情况下,没有意义。

在采取行动之前,也许你可以考虑其他选择,这很难。一些可能激发您灵感的关键词是流和分布式渠道。

相关问题