Elixir GenServer投射到其他节点的最佳方法

时间:2018-09-17 08:51:23

标签: elixir

我的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时,我都希望将此请求投射到其他节点中该组的所有成员。我的问题是,直接在公共api中进行转换还是在handle_cast回调中进行转换更好?

1 个答案:

答案 0 :(得分:2)

Process中进行分派(不在客户端api中进行分派)暗含这些利弊:

专家

  1. 真正的异步行为:由于调度是在服务器端的Process内部,因此您{{1} }继续工作。
  2. 主管:您可以使用Supervisor来监督调度员。
  3. 在调度程序中
  4. 保持状态,以指示例如:最常调用的GenServer,更频繁使用哪种pid,添加调度中的一些逻辑。

缺点

  1. 您创建两个event而不是一个:一个用于调度,一个用于实际完成工作。更多行代码-> 您失去了可读性
  2. 您的某些流程将专用于调度,而另一些流程将专用于完成工作..但所有流程都将来自同一genserver。 您有一个handle_cast用于两种流程
  3. 专门用于分派工作的过程可能不需要保持状态。
  4. 根据流程的类型,您不能使用其他主管的策略。.由于他们来自同一GenServer

如果我必须选择:我会在“客户端api”端进行分派,因为它是一种更简单的模式。如果我需要维持GenServer的{​​{1}}和call周围的状态,我会专门创建第二个状态。