我有一个接受TCP连接的服务器(一个使用gen_tcp的gen_server ),对于每个连接,它都会产生一个supervisor。该监督者(由另一个更永久的监督者监督)然后产生两个进程:特定于协议的处理程序和与数据库对话的客户端上下文。
协议处理程序从套接字获取TCP消息,并将其转换为客户端上下文的消息。客户端上下文获取这些消息并与数据库通信,并返回消息,协议处理程序将这些消息转换为它在TCP上使用的任何协议(telnet、ssh、websockets、HTTP...)并将它们发送回客户端。
我想知道的是哪些OTP行为适用于协议处理程序和客户端上下文进程。我可以滥用gen_server,但它是每个进程对1个连接。gen_fsm看起来可以用于协议处理程序,因为它经历了几个状态,但它非常不适合客户端上下文。我在考虑客户端上下文的gen_event,但我相信它更多地是针对事件聚合器的,而且它只处理来自单一来源的事件。
请随时告诉我,我做这件事的方式完全错了,这是我第一次尝试在这个复杂的地方创建OTP应用程序。
发布于 2011-09-21 15:47:46
听起来您正在尝试重新实现在Cowboy中找到的接受器池。这个应用程序将自己伪装成一个小型超文本传输协议服务器,但它的核心实际上只是一个套接字服务器,看看Andrew Thompson如何将其用于自己的gen_smtp。
发布于 2011-09-21 14:19:57
我认为没有必要使用主管对这两个流程进行“分组”。因此,为TCP协议处理程序(假设它们是单例)提供一个supervisor,并为客户端上下文gen_server提供一个simple_one_for_one。当接收到新连接时,要求simple_one_for_one监督者创建新的客户端上下文gen_server。确保两个进程知道彼此的Pid,以便它们可以通信,也许还可以将它们链接起来进行错误处理。
https://stackoverflow.com/questions/7492992
复制相似问题