0

我正在使用它的 Channel 和 Socket 模块开发一个实时 Phoenix 应用程序。该应用程序由几个进程和 GenServer 组成。我有一个用例,在一个事件(这是来自微服务的 API 调用)上,我需要以不同的时间戳将消息广播到我频道上的所有不同主题。我现在已经在本地机器上使用 Process.send_after(..) 实现了这一点。但我的疑问是:

在一组机器上,因为 API 调用只会命中集群中的一台机器,其他机器将无法发送广播消息。这会导致不准确。我怎样才能让所有的机器都知道这个特定的事件?还是我做错了?

4

1 回答 1

1

假设您知道集群中节点的名称,您可以循环节点,调用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/*可能值得一看。

于 2018-05-26T12:10:06.617 回答