Akka 2中调度器的差异和使用模式是什么?

17
2个回答

11

我认为Sharability是指可以共享特定类型调度程序的参与者数量/类型。至于bulkheading,我不确定,但我会假设它是某种参与者分区,您只想让一个参与者“拥有”一个线程。

以下是各种调度程序类型的代码/ Scaladoc注释中的说明。如果需要更多澄清,请描述不清楚的内容:

Dispatcher:

基于事件的 Dispatcher 将一组Actor绑定到由 BlockingQueue 支持的线程池。

BalancingDispatcher:

基于执行器的事件驱动分发程序,它将尝试将繁忙参与者的工作重新分配给空闲参与者。假定使用此分派程序实例的所有Actor都可以处理已发送到其中一个Actor的所有消息。即这些参与者属于参与者池,对客户端而言,没有关于哪个参与者实例实际处理给定消息的保证。

虽然在此实现中使用的技术通常被称为“工作窃取”,但实际实现可能最好描述为“工作捐赠”,因为正在窃取工作的参与者采取主动。

PinnedDispatcher:

为传递的每个参考Actor专门分配一个线程。通过其messageQueue提供服务。

CallingThreadDispatcher(在akka.testkit中):

仅在当前线程上运行调用的分发程序。此分派程序不创建任何新线程,但可以从不同线程并发地用于同一Actor。调度策略是在当前线程上运行,除非目标Actor或者已经挂起或已经在当前线程上运行(如果它在不同的线程上运行,则该线程将阻塞直到其他调用完成)。如果未运行调用,则将其排队在线程本地队列中,以便在调用堆栈上方的活动调用完成后执行。如果仅使用一个线程,则会导致完全确定的执行顺序。

暂停和恢复是针对一个演员的全局操作,这意味着它们可能会影响不同的线程,从而导致复杂性。如果在暂停期间排队了消息(仅限于线程本地),那么在恢复时运行它们的唯一线程是实际调用恢复方法的线程。因此,所有未被当前正在处理的线程本地队列消耗完的线程本地队列(这可能发生在另一个线程的调用中完全进行挂起-排队-恢复过程中)都将被收集到当前线程本地队列中,然后执行。可以在演员的调用堆栈内部暂停演员。


8

Dispatcher是默认实现。
PinnedDispatcher每个actor有一个线程,因此线程被固定到它们的actors上。

可共享性意味着如果多个actors想要使用同一个dispatcher实例,则会应用哪些限制。

Bulkheading意味着将各个部分相互隔离 - 根据维基百科


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接