Приложение Феникс на парк машин - PullRequest
0 голосов
/ 26 мая 2018

Я разрабатываю приложение Phoenix в реальном времени, используя его модули Channel и Socket.Приложение состоит из нескольких процессов и GenServers.У меня есть сценарий использования, когда при событии (которое является вызовом API из микросервиса) мне нужно передавать сообщения на разные темы моего канала с разными временными метками.Я добился этого с помощью Process.send_after (..) на моей локальной машине на данный момент.Но я сомневаюсь:

На флоте машин, поскольку вызов API вызовет только одну машину в кластере, другие машины не смогут отправлять широковещательные сообщения.И это приведет к неточности.Как я могу сообщить всем машинам об этом конкретном событии?Или я делаю это неправильно?

1 Ответ

0 голосов
/ 26 мая 2018

Предполагая, что вы знаете имена узлов в кластере, вы можете зацикливать узлы, вызывая Node.spawn/2 для каждого:

def broadcast(msg) do
  Process.send_after ...
end

def broadcast_everywhere(msg) do
  Enum.each(@nodes, fn node ->
    # if not node == Node.self do
      Node.spawn node, fn ->
        Broadcaster.broadcast(msg)
      end
    # end
  end)
end

Раскомментируйте закомментированные строки, если текущий узел былуже обслужен и [вероятно] каким-то образом гарантирует, что узлы подключены и находятся в активном состоянии.

Кроме того, Node.spawn_link/* может стоить взглянуть на.

...