3

我有一个接受 TCP 连接的服务器(使用 gen_tcp 的 gen_server),并且对于每个连接,它都会生成一个主管。该主管(由另一个更永久的主管监督)然后产生两个进程:一个特定于协议的处理程序和一个与数据库对话的客户端上下文。

协议处理程序从套接字获取 TCP 消息并将它们转换为客户端上下文的消息。客户端上下文获取这些消息并与数据库对话并返回消息,协议处理程序将其转换为它通过 TCP 使用的任何协议(telnet、ssh、websockets、HTTP ...)并将它们发送回客户端。

我想知道的是哪些 OTP 行为适合协议处理程序和客户端上下文进程。我可以滥用 gen_server,但它是每个进程对 1 个连接。gen_fsm 看起来它可以用于协议处理程序,因为它经历了几个状态,但它非常不适合客户端上下文。我正在考虑 gen_event 用于客户端上下文,但我被引导相信它更多地用于事件聚合器,并且这只处理来自单一来源的事件。

随意告诉我,我的做法完全错误,这是我第一次尝试在这个复杂的任何地方制作 OTP 应用程序。

4

2 回答 2

2

听起来您正在尝试重新实现在Cowboy中找到的接受器池。这个应用程序伪装成一个小型 HTTP 服务器,但它实际上只是一个核心的套接字服务器,看看 Andrew Thompson 如何将它用于自己的gen_smtp

于 2011-09-21T07:47:46.043 回答
1

我认为不需要使用主管来“分组”这两个流程。因此,TCP 协议处理程序的单个主管(假设它们是单例的),以及客户端上下文 gen_server 的 simple_one_for_one。当接收到新连接时,simple_one_for_one 主管被要求创建一个新的客户端上下文 gen_server。确保这两个进程知道彼此的 Pid,以便它们可以通信,并可能将它们链接起来以进行错误处理。

于 2011-09-21T06:19:56.517 回答