2012-03-09 5 views
17

У меня возникли проблемы с пониманием различий и рекомендованного использования dispatchers in Akka 2. Я думаю, что я понимаю, как ведут себя BalancingDispatcher и CallingThreadDispatcher, но я понятия не имею о Dispatcher и PinnedDispatcher.Каковы различия и модели использования диспетчеров в Akka 2?

Я не понимаю понятия Sharability и Bulkheading, либо.

ответ

11

Я считаю, что Sharability относится к числу/типу актеров, которые могут совместно использовать диспетчер определенного типа. Я не уверен в переборке, но я собираюсь предположить, что это относится к какому-либо разделению актеров, где вы хотите, чтобы один актер «владел» потоком.

Вот описание комментариев кодов/скалядоков для различных типов диспетчеров. Если есть дополнительные разъяснения нужно, пожалуйста, опишите, что неясно:

грузоотправитель:

Событие на основе Dispatcher связывает набор актеров для пула потоков подкрепленного BlockingQueue.

BalancingDispatcher:

исполнитель на основе событийного диспетчер, который будет пытаться перераспределить работу от занятых актеров на холостой ход актеров. Предполагается, что все участники, использующие один и тот же экземпляр этого диспетчера, могут обрабатывать все сообщения, отправленные одному из участников. То есть актеры принадлежат к пулу актеров, а к клиенту нет никакой гарантии, какой экземпляр актера фактически обрабатывает данное сообщение.

Несмотря на то, что техника, используемая в этой реализации, широко известна как «кража работы», фактическая реализация, вероятно, лучше всего описывается как «работа пожертвования», потому что актер, работа которого украден, берет на себя инициативу.

PinnedDispatcher:

Посвящает уникальный поток для каждого актера переданного в качестве ссылки. Служил через свой messageQueue.

CallingThreadDispatcher (в akka.testkit):

грузоотправитель, который работает только на вызовы текущего потока. Этот диспетчер не создает никаких новых потоков, но может использоваться из разных потоков одновременно для одного и того же актера. Стратегия отправки должна выполняться в текущем потоке, если целевой актор не будет приостановлен или уже запущен в текущем потоке (если он работает в другом потоке, то этот поток будет блокироваться до тех пор, пока этот другой вызов не будет завершен); если вызов не запущен, он ставится в очередь в потоковой локальной очереди, которая будет выполняться после завершения активного вызова до завершения стека вызовов. Это приводит к полностью детерминированному исполнению, если используется только один поток.

Приостановка и возобновление являются глобальными действиями для одного актора, то есть они могут влиять на разные потоки, что приводит к осложнениям. Если сообщения приостановлены (поточно локально) в течение приостановленного периода, единственным потоком для их запуска при возобновлении является поток, фактически вызывающий метод возобновления. Следовательно, все поточно-локальные очереди, которые в настоящее время не сливаются (возможно, поскольку suspend-queue-resume может произойти полностью во время вызова в другом потоке) зачерпнуты в текущую очередь потоков, которая затем выполняется.Можно приостановить действие актера из его стека вызовов.

8

Dispatcher - это реализация по умолчанию.
PinnedDispatcher имеет одну нить на актера, поэтому потоки прикрепляются к их актерам.

Совместимость означает, что ограничения применяются, если несколько участников хотят использовать один и тот же экземпляр диспетчера.

Перегородка означает изолирующие секции друг от друга - according to Wikipedia.