我有一个Elixir应用程序在节点集群(n1@127.0.0.1和n2@127.0.0.1)上运行,我们称之为 Myapp.Server .
在其中,我有一个模块 run(parameter) ,其目标是联系Rest Web服务以获取一些数据(参数是要抓取的数据的数量),将其转换为XML然后将其放入文件中,最终将其转移到外部FTP .
调用
Myapp.Server.run(any_number)
因此给了我预期的结果 .
我刚刚开始学习Elixir和凤凰城,但是在我的脑海中不断出现两个问题,尽管我付出了努力,但我找不到任何提示 . (或者我可能无法清楚地理解它)
所以我的两个问题,
Elixir应用程序(在节点或节点集群上运行)是否可以广播到Phoenix应用程序? (例如,最终用户要知道结果)
在另一方面,
我们是否可以通过单击在不同节点上运行的Phoenix页面中的按钮来发起启动Elixir模块的请求?
可以请某人指导我或给我一篇文章吗?
问候,
皮埃尔
PS:到目前为止我在读什么 .
-
Dave Thomas编程Elixir 1.2
-
由Chris McCord,Bruce Tate和JoséValim编写凤凰剧
-
来自EMSON先生的Udemy / Elixir介绍
1 回答
Phoenix应用程序绝对可以在其他节点上调用Elixir函数(只要网络允许通信) . 你的凤凰应用程序只是另一个elixir应用程序,没有什么特别之处 .
要在另一个节点上调用函数,请参阅Process.send函数,特别是
dest
是元组的位置:{atom, node}
. atom是另一个节点上的命名进程,节点是节点的名称,在您的情况下是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