我无法理解dispatchers in Akka 2的差异和推荐用法。我想我理解BalancingDispatcher和CallingThreadDispatcher的行为方式,但我不知道Dispatcher和PinnedDispatcher。
我也不理解Sharability
和Bulkheading
的概念。
答案 0 :(得分:11)
我认为Sharability是指可以共享特定类型的调度员的角色的数量/类型。我不确定批量处理,但我会假设它指的是某种类型的actor分区,你只希望一个演员“拥有”一个线程。
以下是各种调度程序类型的代码/ scaladoc注释的说明。如果需要更多说明,请描述不清楚的内容:
<强>分派器:强>
基于事件的Dispatcher
将一组Actors绑定到由BlockingQueue
备份的线程池。
<强> BalancingDispatcher:强>
基于执行程序的事件驱动调度程序,它将尝试将工作从繁忙的actor重新分配给空闲的actor。假设使用此调度程序的同一实例的所有actor都可以处理已发送给其中一个actor的所有消息。即actor属于一个actor池,对于客户端,无法保证哪个actor实例实际处理给定的消息。
虽然这种实现中使用的技术通常被称为“工作窃取”,但实际实施可能最好被描述为“工作捐赠”,因为工作被盗的行为者是主动的。
<强> PinnedDispatcher:强>
为传入的每个actor提供一个唯一的线程作为参考。通过messageQueue服务。
CallingThreadDispatcher(在akka.testkit中):
仅在当前线程上运行调用的Dispatcher。此调度程序不会创建任何新线程,但可以同时为同一个actor使用不同的线程。调度策略是在当前线程上运行,除非目标actor已暂停或已在当前线程上运行(如果它在另一个线程上运行,则该线程将阻塞,直到其他调用完成);如果未运行调用,则它将在线程本地队列中排队,以便在调用堆栈完成后的活动调用完成后执行。如果只使用一个线程,这将导致完全确定的执行顺序。
暂停和恢复是一个角色的全局动作,这意味着它们可以影响不同的线程,这会导致并发症。如果消息在挂起期间排队(线程本地),则在恢复时运行它们的唯一线程是实际调用resume方法的线程。因此,当前没有被耗尽的所有线程本地队列(可能,因为挂起 - 队列 - 恢复可能完全在不同线程上的调用期间发生)被挖掘到当前线程本地队列中,然后执行该队列。可以从其调用堆栈中挂起一个actor。
答案 1 :(得分:8)
Dispatcher是默认实现 PinnedDispatcher每个actor都有一个线程,因此线程固定在他们的actor上。
可修复性表示如果多个actor想要使用相同的调度程序实例,则适用哪些限制。
Bulkheading意味着将部分彼此隔离 - according to Wikipedia。