我在一个节点集群(n1@127.0.0.1和n2@127.0.0.1)上运行了一个Elixir应用程序,我们称之为 Myapp.Server 。
在其中,我有一个模块 run(参数),其目标是联系Rest Web Service以获取一些数据(参数是要抓取的数据的数量),将其转换为然后将XML放入一个文件中,最终将其传输到外部FTP。
致电
Myapp.Server.run(any_number)
因此给了我预期的结果。
我刚刚开始学习Elixir和凤凰城,但是我脑海中不断出现两个问题,尽管我付出了努力,但我找不到任何提示。 (或者我可能无法清楚地理解它)
所以我的两个问题,
Elixir应用程序(在节点或节点集群上运行) 广播到凤凰城的申请? (例如,最终用户要注意结果)
另一方面,
我们是否可以通过点击在不同节点上运行的Phoenix页面中的按钮来发起启动Elixir模块的请求?
有人可以指导我或者给我一篇文章吗?
此致
皮尔
PS:到目前为止我正在阅读的内容。答案 0 :(得分:0)
Phoenix应用程序绝对可以在其他节点上调用Elixir函数(只要网络允许通信)。你的凤凰应用程序只是另一个elixir应用程序,没有什么特别之处。
要在另一个节点上调用函数,请参阅Process.send函数,特别是dest
是元组的位置:{atom, node}
。原子是另一个节点上的命名进程,节点是节点的名称,在您的情况下为n1@127.0.0.1
。即。 send({:SomeNamedProcess, "n1@127.0.0.1"} some_message)
GenServers也可以接受call,cast和server type中引用的{atom, node}
元组。即。 GenServer.call({:SomeNamedProcess, "n1@127.0.0.1"}, {:do_something, some_message})
。
此外,您可以使用[Node.spawn_link](例如send({:SomeNamedProcess, "n1@127.0.0.1"} some_message)
)函数在另一个节点上生成ad-hoc函数。即。 Node.spawn_link :"n1@127.0.0.1", fn -> IO.puts("Hello from #{inspect self}") end
。
您也可以选择spawn Elixir Tasks on another node。
选择其中一种技术实际上是您确切用例的问题。
您可能会对流程注册表感兴趣,因为节点之间存在另一个间接层:
https://m.alphasights.com/process-registry-in-elixir-a-practical-example-4500ee7c0dcc#.sws1ye9e9
https://medium.com/@StevenLeiva1/elixir-process-registries-a27f813d94e3#.5xvkv03k5