Подтвердить что ты не робот

Каковы различия и модели использования диспетчеров в Akka 2?

Мне трудно понять различия и рекомендовать использование диспетчеров в Akka 2. Я думаю, что я понимаю, как BalancingDispatcher и CallingThreadDispatcher, но я понятия не имею о Dispatcher и PinnedDispatcher.

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

4b9b3361

Ответ 1

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

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

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

Основанный на событии Dispatcher связывает набор Актеров с пулом потоков, резервным копированием которого является BlockingQueue.

BalancingDispatcher:

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

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

PinnedDispatcher:

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

CallingThreadDispatcher (в akka.testkit):

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

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

Ответ 2

Диспетчер - это реализация по умолчанию.
PinnedDispatcher имеет один поток для каждого актера, поэтому потоки привязаны к их актерам.

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

Переборка означает выделение секций друг от друга - согласно Википедии.