我很难理解dispatchers in Akka 2的区别和推荐用法。我想我知道BalancingDispatcher和CallingThreadDispatcher是如何工作的,但我对Dispatcher和PinnedDispatcher一无所知。
我也不理解Sharability和Bulkheading的概念。
发布于 2012-03-10 08:02:36
我认为可共享性指的是可以共享特定类型的调度程序的参与者的数量/类型。我不确定是不是有什么问题,但我假设它指的是某种角色划分,你只想让一个角色“拥有”一个线程。
下面是各种dispatcher类型的代码/scaladoc注释中的描述。如果需要更多说明,请描述不清楚的内容:
调度程序:
基于事件的Dispatcher将一组BlockingQueue绑定到由Actor备份的线程池。
BalancingDispatcher:
一个基于执行器的事件驱动的分派器,它将尝试将工作从繁忙的参与者重新分配到空闲的参与者。假设使用此分派器的同一实例的所有参与者都可以处理已发送到其中一个参与者的所有消息。也就是说,参与者属于一个参与者池,对于客户端来说,不能保证哪一个参与者实例实际处理了给定的消息。
尽管此实现中使用的技术通常被称为“工作窃取”,但实际实现可能最好被描述为“工作捐赠”,因为被窃取工作的参与者是主动的。
PinnedDispatcher:
为作为引用传入的每个参与者指定唯一的线程。通过其messageQueue提供服务。
CallingThreadDispatcher (在akka.testkit中):
仅在当前线程上运行调用的Dispatcher。此调度程序不会创建任何新线程,但可以从不同线程中为同一参与者并发使用它。分派策略是在当前线程上运行,除非目标执行元被挂起或已经在当前线程上运行(如果它在另一个线程上运行,则此线程将阻塞,直到另一个调用完成);如果调用没有运行,它将在线程本地队列中排队,以便在调用堆栈上方的活动调用完成后执行。如果只使用一个线程,这将导致完全确定的执行顺序。
暂停和恢复是一个参与者的全局操作,这意味着它们可以影响不同的线程,这会导致复杂性。如果消息在挂起期间排队(线程本地),则在恢复时运行这些消息的唯一线程是实际调用resume方法的线程。因此,当前未被排空的所有线程本地队列(可能,因为挂起-队列-恢复可能完全发生在对不同线程的调用期间)被收集到当前线程本地队列中,然后执行该队列。可以从其调用堆栈中挂起参与者。
发布于 2012-03-10 21:23:12
Dispatcher是默认实现。
PinnedDispatcher的每个参与者都有一个线程,因此线程被固定到它们的参与者。
可共享性意味着当多个参与者想要使用同一个dispatcher实例时应用哪些限制。
Bulkheading意味着将各个部分相互隔离- according to Wikipedia。
https://stackoverflow.com/questions/9637031
复制相似问题