Эликсир удаленный pubsub

Я изучаю Elixir, и одна из вещей, которые я хотел бы реализовать, - это простая pubsub, в которой издатель и потребитель находятся на разных узлах, пока без использования таких инструментов, как Redis.

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

Другой вариант, который я пробовал, - это gproc. Node.list () показывает мне мои узлы, так что швы кластера в порядке, но :gproc.send({:p, :l, :event_manager}, {:message, "stuff"}) по-прежнему работает только внутри одного узла.

У меня такой вопрос: есть ли какой-нибудь стандартный способ создания pubsub с помощью Elixir, который я, должно быть, пропустил?


person Eduárd Moldován    schedule 08.05.2017    source источник
comment
Я не использовал :gproc, поэтому не могу комментировать, что вам не хватает. Вы смотрели различные пакеты pubsub на hex.pm? Также phoenix_pubsub не имеет никаких зависимостей от phoenix, поэтому я мог бы использовать его без остальной части феникса.   -  person Steve Pallen    schedule 08.05.2017
comment
Я пробовал, да. Собираюсь попробовать phoenix_pubsub и Pg2PubSub.   -  person Eduárd Moldován    schedule 09.05.2017
comment
Дайте нам знать, как это происходит   -  person Steve Pallen    schedule 09.05.2017
comment
Я просто сделал быструю и простую реализацию на основе: pg2. Я в основном создаю одну и ту же группу как для издателя, так и для потребительских приложений, на потребителе я присоединяюсь к группе, в которой я хочу потреблять, затем я просто отправляю сообщение от производителя всем узлам, которые присоединились к этой группе.   -  person Eduárd Moldován    schedule 09.05.2017


Ответы (2)


Вы смотрели GenStage? Он построен на основе GenServer и должен работать на всех узлах кластера.

приведен пример цепочки от производителя к производителю / потребителю к потребителю., и вы можете изменить этот пример, чтобы он был простым производителем для потребителя.

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

person Ryan Duffield    schedule 09.05.2017

Ну, простой ответ - потому что

{:p, :l, :event_manager}

должно быть

{:p, :g, :event_manager}

:l означает local, а :g означает :global.

Но я бы просто предложил использовать phoenix_pubsub, потому что он очень хорошо написан для распределенной системы pubsub. gproc немного сложнее, чем просто pubsub система.

Кроме того, phoenix_pubsub делает что-то действительно умное, имея только по одному process на каждом node, обрабатывающем свою локальную ets таблицу распределения, и эти процессы просто общаются друг с другом для достижения распределения.

person Azolo    schedule 09.05.2017
comment
Я пропустил: g vs: l. Спасибо что подметил это. Я еще раз посмотрю на phoenix_pubsub - person Eduárd Moldován; 11.05.2017