我应该使用哪些OTP行为?

时间:2011-09-20 23:29:39

标签: erlang otp

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

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

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

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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