如何构建 Erlang OTP UDP 服务器

Posted

技术标签:

【中文标题】如何构建 Erlang OTP UDP 服务器【英文标题】:How to structure an Erlang OTP UDP server 【发布时间】:2012-11-28 01:51:00 【问题描述】:

我只是在阅读 Manning 的 Erlang & OTP In Action。很不错的书,我觉得。它包含一个不错的 TCP 服务器示例,但我想编写一个 UDP 服务器。到目前为止,这就是我构建应用程序的方式。

my_app                        % app behaviour
|-- my_sup                    % root supervisor 
    |-- my_server.erl         % gen_server to open UDP connection and dispatch
    |-- my_worker_sup         % simple_one_to_one supervisor to start workers
        |-- my_worker_server  % gen_server worker 

所以,my_app 开始于 my_sup,而后者又开始于 my_worker_supmy_server。 UDP 连接以活动模式在my_server 中打开,以便在每个新的 UDP 消息上调用handle_info/2 作为响应,我调用my_worker_sup:start_child/2 将消息传递给新的工作进程进行处理。 (实际上,根据本书的建议,最后一次调用 start_child/2 是在一个 API 函数中隐藏一些细节,但这实际上是发生的。)

我是否患有 OTP 发烧? my_worker_server 真的应该实现 gen_server 行为吗?我需要my_worker_sup吗?

我这样设置它,以便我可以通过 start_child/2 调用将 my_worker_sup 用作工厂,但我只使用工人的 init/1handle_info(timeout,State) 函数首先设置状态,然后处理关闭工作器之前的消息。

我应该直接生成工人吗?也许另一种行为更适合?

谢谢, 碳氢化合物

【问题讨论】:

我想我可能已经找到了如何将工人作为“特殊流程”融入 OTP 的答案erlang.org/doc/design_principles/spec_proc.html#id72749 【参考方案1】:

这个问题的关键答案是:“你希望你的应用程序如何崩溃?

如果一个工人死了,那该怎么办?如果这应该停止一切,包括 UDP 连接,那么您当然可以直接在 my_server 下 spawn_link 它们,不需要主管树。但是如果你想让它们能够优雅地重启或者别的什么,那么上图通常会更好。也许在 my_server 的工作人员上添加一个监视器,这样它就可以保存一本关于谁还活着的书。

在我的 utp erlang 库中,我的结构几乎相同。 Master 处理 UDP 套接字并根据 ETS 中保存的路由表转发给 worker。每个worker保持一个连接状态,可以处理传入的信息。

由于您不跟踪状态,那么您最好的选择可能是通过proc_lib:spawn_link 运行,然后将它们作为瞬态进程挂接到 s_1_1 主管。这样,您将强制将过多的崩溃传播到主管树,但允许它们以normal 退出。这使您可以让它们只运行一次。

请注意,您也可以直接在 my_server 中处理所有内容,但是您将无法同时处理数据。这可能会或可能不会被接受。一般规则是当您有并发工作需要彼此相邻执行、阻塞或以某种方式表现时生成一个新进程。

【讨论】:

非常感谢您的回答。不,我不希望整个服务器崩溃。我正在尝试编写 DNS 服务器github.com/hcvst/erlang-dns。我什至没有想到可能必须跟踪连接。你说的那个图书馆是什么。我可以学习吗?再次感谢,HC 确定是:github.com/jlouis/erlang-utp/blob/master/src/utp_sup.erl - gen_utp 运行接受队列和套接字。 gen_utp_decoder 是解码器和调度器。分开处理崩溃。最后,工人池包含被派遣的工人。研究进程表的簿记——但我的思考过程可能是错误的,所以要小心。

以上是关于如何构建 Erlang OTP UDP 服务器的主要内容,如果未能解决你的问题,请参考以下文章

使用 Erlang/OTP 构建容错软实时 Web 应用程序

如何在Erlang / OTP中构建MQ使用者循环?

使用OTP原理构建一个非阻塞的TCP服务器(转)

您如何设计基于 Erlang/OTP 的分布式容错多核系统的架构?

OTP 19.2.3 发布,Erlang 应用服务器

您如何设计基于Erlang / OTP的分布式容错多核系统的架构?