Безопасно ли использовать сокет ZMQ в Актере, работающем на PinnedDispatcher?

Насколько я могу судить из документации, сокеты ZeroMQ не должны используется (например, для чтения/записи) из разных потоков.

Это, в свою очередь, не позволяет мне использовать сокет ZMQ в Akka Actor, работающем в диспетчере по умолчанию (нет гарантии, какой поток будет выполнять мой метод receive).

Позволит ли использование PinnedDispatcher безопасно использовать такой сокет внутри Актера, при условии, что я буду следить за тем, чтобы не блокировать его (по крайней мере, не слишком долго)?

Этот диспетчер выделяет уникальный поток для каждого использующего его актора; то есть у каждого актера будет свой собственный пул потоков с одним потоком в пуле.

через: https://doc.akka.io/docs/akka/2.5/dispatchers.html#types-of-dispatchers

Я использую JeroMQ 0.4.0 и Akka 2.5. Я понимаю, что у Akka раньше было расширение ZeroMQ, но оно кажется в основном заброшенным.


person Patryk Koryzna    schedule 11.04.2018    source источник
comment
У вас уже есть ответ на ваш вопрос? Ваш подход (с использованием PinnedDispatcher) работает? Мне также нужно интегрировать связь ZMQ с Akka 2.5.   -  person Jonny Dee    schedule 08.10.2019
comment
Я не помню, чтобы у меня были какие-то серьезные проблемы, но я не могу утверждать со 100% уверенностью. Я не работал над этим проектом больше года, и у меня больше нет к нему доступа. Удачи, однако!   -  person Patryk Koryzna    schedule 09.10.2019


Ответы (1)


Что ж, потокобезопасность дорого обходится .

ZeroMQ, начиная с самой ранней версии (вы имеете в виду API версии 2.1, в то время как существуют версии API старше 4.2+, выпущенные и доступные в 2018/Q2+), создавался под общим набором значений, также известным как Zen-of-Zero, который стремится к тому, чтобы все происходило максимально эффективно, с минимальными затратами ресурсов и с минимальной задержкой (лучше вообще без нее).


Можно увидеть недавние попытки добавить потокобезопасность в рефакторинг ZeroMQ 4.2+.

тем не менее, это не означает, что это может быть достигнуто бесплатно, не так ли?

Никто не пострадает, если использовать надлежащие инструменты надлежащим образом, не так ли?

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

В любом случае, примечание Akka предупреждает, что совместимость "как есть" была заморожена на уровне API v.2:

Текущая версия zeromq-scala-bindings совместима только с zeromq 2; zeromq 3 не поддерживается.


Так как ?

Если действительно необходимо смешивать несколько различных событийных циклов (как указано выше), я бы предпочел делегировать задачу набору независимо работающих (совмещенных или распределенных) экземпляров Context(), а не чем пытаться поделиться любыми экземплярами Socket()-AccessPoint-level или пытаться использовать "закрепленный" -обещание, только что опосредованное внешней (одновременно сосуществующей) инфраструктурой цикла событий, отличной от ZeroMQ.

Чистые проекты ZeroMQ, не требующие совместного использования, гораздо безопаснее и быстрее, чем пытаться жонглировать все большим количеством артефактов дизайна (и если ваша область требует процедур контроля качества, тем больше, если доказательства проверки проекта и проверки должны быть доставлены до того, как приемка может быть даже запланирована — попробуйте просто представить затраты на тестирование, контроль качества / проверки для дикой смеси игрушек, которые просто хотели иметь детерминированные, неблокирующие, безошибочные и надежные / устойчивые полевые операции)

Внимание!
ZeroMQ Socket()-экземпляр не является tcp-сокетом, каким вы его знаете. Лучше всего прочитать об основных концептуальных различиях в иерархии ZeroMQ менее чем за пять секунд или другие сообщения и обсуждения здесь.

Context()-экземпляры имеют свои собственные пулы потоков ввода-вывода под своим собственным доменом управления, а также имеют сопоставление, подобное «DMA», между соответствующими Context' s Socket()-экземпляр допускает сходство с соответствующими потоками ввода-вывода (группами) Context, поэтому глобальное представление о «закреплении» может не влиять на предполагаемые настройки сопоставления ресурсов.


И последнее, но не менее важное: конфигурации, относящиеся к порту Akka,
которые не соответствуют значениям по умолчанию собственного API ZeroMQ:

#####################################
# Akka ZeroMQ Reference Config File #
#####################################

# This is the reference config file that contains all the default settings.
# Make your edits/overrides in your application.conf.

akka {

  zeromq {

    # The default timeout for a poll on the actual zeromq socket.
    poll-timeout = 100ms

    # Timeout for creating a new socket
    new-socket-timeout = 5s

    socket-dispatcher {
      # A zeromq socket needs to be pinned to the thread that created it.
      # Changing this value results in weird errors and race conditions within
      # zeromq
      executor = thread-pool-executor
      type = "PinnedDispatcher"
      thread-pool-executor.allow-core-timeout = off
    }
  }
}
person user3666197    schedule 11.04.2018
comment
Я использую Akka 2.5 - расширения ZeroMQ были удалены довольно давно: github.com/akka /акка/вопросы/15864 - person Patryk Koryzna; 12.04.2018