Erlang 我应该为此使用什么OTP行为?

Erlang 我应该为此使用什么OTP行为?,erlang,otp,Erlang,Otp,我有一个接受TCP连接的服务器(一个使用gen_TCP的gen_服务器),它为每个连接生成一个管理器。该主管(由另一个更为永久的主管监督)随后生成两个进程:协议特定的处理程序和与数据库对话的客户机上下文 协议处理程序从套接字获取TCP消息,并将它们转换为客户端上下文的消息。客户端上下文接收这些消息并与数据库对话,并返回消息,协议处理程序将这些消息转换为它通过TCP使用的任何协议(telnet、ssh、websockets、HTTP…),然后将它们发送回客户端 我想知道的是什么OTP行为适合于协议

我有一个接受TCP连接的服务器(一个使用gen_TCP的gen_服务器),它为每个连接生成一个管理器。该主管(由另一个更为永久的主管监督)随后生成两个进程:协议特定的处理程序和与数据库对话的客户机上下文

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

我想知道的是什么OTP行为适合于协议处理程序和客户端上下文进程。我可以滥用gen_服务器,但每个进程对只有一个连接。gen_fsm看起来可以用于协议处理程序,因为它经历了几个状态,但是对于客户端上下文来说它非常不合适。我曾考虑将gen_事件用于客户端上下文,但我一直认为它更多地用于事件聚合器,而这只处理来自单个源的事件


请随意告诉我,我的做法完全错了,这是我第一次尝试在这座建筑附近制作OTP应用程序。

我认为不需要使用主管对这两个过程进行“分组”。因此,TCP协议处理程序只有一个管理器(假设它们是单例的),客户端上下文gen_服务器只有一个简单的管理器。接收到新连接时,将要求simple_one for_one主管创建新的客户端上下文gen_server。确保这两个进程相互了解,以便它们可以通信,也许还可以将它们链接起来以进行错误处理。

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

还要考虑:您真的需要两个进程吗?他们同时做什么吗?有时,如果交互是连续的,那么一个进程保持两种不同的状态就足够了。@Adam:我想要两个单独的进程的原因是,我可以将不同的连接处理程序插入到同一个客户机上下文中。这似乎是最简单的方法。如果我用Python或其他什么东西来做这件事,我会使用两个类。这看起来合理吗?您还可以在流程启动时参数化连接处理程序的模块名称,例如
spawn(客户机,启动,[my_connection\u handler,OtherData])
。区分并发活动(需要多个流程)和责任划分很重要(可能只是在同一进程中运行不同的库)。@Adam:可靠性如何?如果它们在同一进程中,我必须使用TCP连接重新启动进程(这可能会产生不良的副作用;我计划暂时保留它们)任何时候客户端上下文出现错误。我之所以要使用主管对它们进行分组,是为了让我可以使用rest\u for\u one并让死掉的连接杀死上下文。谢谢!我查找了类似的内容,但发现了yaws。它似乎比我需要的更复杂。