首页 > 解决方案 > Elixir GenServer 投射到其他节点的最佳方式

问题描述

我的 GenServer 中有以下功能:

def add_event(param1, param2) do
    Enum.each(:pg2.get_members("some_group"), fn pid -> GenServer.cast(pid, {:new_event, param1, param2}) end)
  end

  def handle_cast({:new_event, param1, param2}, state) do
    #do something
    {:noreply, state}
  end

我的想法是,每当add_event被调用时,我都想将此请求发送给其他节点中组的所有成员。handle_cast我的问题是,直接在公共 api 中进行投射是个好主意,还是在回调中进行更好

标签: elixir

解决方案


Process在一个(而不是在客户端 api 中)进行调度,意味着这些优点和缺点:

优点

  1. 真正的异步行为:由于调度是在服务器端,在 a 内部Process,你不会在调度完成后等待,你GenServer可以继续工作。
  2. Supervisor:您可以使用Supervisor来监督调度员。
  3. 在 dispatcher 中保留一个 state,例如:pid最常调用的,最常event使用的,在 dispatcher 中添加一些逻辑。

缺点

  1. 您创建两个handle_cast而不是一个:一个用于调度,一个用于实际执行工作。更多的代码行 ->你会失去可读性
  2. 您的一些流程将专门用于调度,而其他一些流程将专门用于完成这项工作..但它们都将来自同一个 genserver。你有GenServer两种工艺
  3. 专门用于调度作业的进程可能不需要维护状态。
  4. 您不能根据流程的类型使用不同的主管策略。因为它们来自相同的GenServer

如果我必须选择:我会在“客户端 api”端进行调度,因为它是一个更简单的模式。如果我需要围绕我的 和 维护一个状态,call我会创建第二个专用于此的状态。castGenServer


推荐阅读