阿卡演员故意封锁

Eri*_*luk 1 akka akka-supervision

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

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

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

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

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

End*_*rga 5

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