elixir - 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 中进行投射是个好主意,还是在回调中进行更好
解决方案
Process
在一个(而不是在客户端 api 中)进行调度,意味着这些优点和缺点:
优点:
- 真正的异步行为:由于调度是在服务器端,在 a 内部
Process
,你不会在调度完成后等待,你GenServer
可以继续工作。 - Supervisor:您可以使用Supervisor来监督调度员。
- 在 dispatcher 中保留一个 state,例如:
pid
最常调用的,最常event
使用的,在 dispatcher 中添加一些逻辑。
缺点:
- 您创建两个
handle_cast
而不是一个:一个用于调度,一个用于实际执行工作。更多的代码行 ->你会失去可读性 - 您的一些流程将专门用于调度,而其他一些流程将专门用于完成这项工作..但它们都将来自同一个 genserver。你有
GenServer
两种工艺 - 专门用于调度作业的进程可能不需要维护状态。
- 您不能根据流程的类型使用不同的主管策略。因为它们来自相同的
GenServer
如果我必须选择:我会在“客户端 api”端进行调度,因为它是一个更简单的模式。如果我需要围绕我的 和 维护一个状态,call
我会创建第二个专用于此的状态。cast
GenServer
推荐阅读
- spring-batch - 如何在 Spring Batch 中从二进制文件中读取数据
- android - 在 Android 上找不到保存的 CSV 或 TXT 文件
- ruby-on-rails - 如何将 ruby 逻辑插入到 erb 文件中 div 标签的样式属性中?
- typescript - typecirpt 我如何定义 ...props 接口?
- python - 如何将python嵌套字典转换为非嵌套字典?
- powershell - 当它之后有另一个 GET 时,GET 不打印?
- google-calendar-api - 通过 API 创建的事件未在打印中列出
- python - 如何使用 keras 将 LSTM 模型转换为线性回归?
- java - 进行邮件合并后样式不保留(包括字体大小、字体粗细、字体颜色……)
- python-3.x - 打印附加到自动缩放组的实例使用的自动缩放组和 AMI