【问题标题】:Elixir - Call gen server from another nodeElixir - 从另一个节点调用 gen 服务器
【发布时间】:2017-11-13 13:03:33
【问题描述】:

我的电脑上有两个节点(foo@my-pcbar@my-pc)。
bar 节点中有一个简单的 gen-server:

defmodule Bar.Server do
  use ExActor.GenServer, export: :bar_server
  defstart start_link, do: initial_state(0)
  defcall get, state: state, do: reply(state)
  defcast(set(num), state: state, do: new_state(state + num))
end

Genserver 已启动并正在运行 所以当我跑步时:

GenServer.call(:bar_server, :get)

效果很好。
我通过运行 foo Node.connect :'bar@my-pc'foo 连接到 bar
我所期望的是现在foo 将熟悉bar 中的genserver :aa
但是 - 当我运行时

GenServer.call(:bar_server, :get) 

我明白了:

 (EXIT) no process: the process is not alive or there's no process currently associated with the given name, possibly because its application isn't started  

我假设我错过了一些东西。但可以弄清楚是什么。

【问题讨论】:

  • 这行得通吗:GenServer.call({:bar_server, :'bar@my-pc'}, :get)?
  • 是的,我愿意。谢谢

标签: elixir nodes gen-server


【解决方案1】:

您注册一个进程以使其成为单例:使其仅作为实例可用。

如果你给它命名为“name: processname”,那么你就不能在那个节点上注册另一个同名的进程。

如果您需要多个进程,那么您可以使用主管来获取该进程的子进程,使用它并要求主管在完成后终止子进程。

此设计模式将帮助您通过主管管理子进程,以防子进程崩溃。

【讨论】:

    【解决方案2】:

    假设您只希望在两个节点之间运行一个 GenServer 实例,您需要将 GenServer 显式注册为全局:

    use ExActor.GenServer, export: {:global, :bar_server}
    

    【讨论】:

    • 这假设在连接同一集群中的两个节点时有效(在 kubernetes 上)。因为由于某种原因,我在尝试访问 genserver 时不断收到该错误no process... 。 ?
    • 对不起,我忘了说你需要用GenServer.call({:global, :bar_server}, :get)打电话
    • 在一台机器上运行多个Gen server实例时如何处理?
    猜你喜欢
    • 2019-11-01
    • 2017-04-07
    • 2019-08-27
    • 1970-01-01
    • 2019-03-06
    • 2019-01-16
    • 2017-04-01
    • 1970-01-01
    • 2019-01-28
    相关资源
    最近更新 更多