Erlang动态接受传入的tcp连接

hyp*_*ean 10 erlang tcp gen-event

我想要解决的问题:有一个Erlang TCP服务器侦听特定端口(代码应该驻留在某种面向外部的接口/ API),每个传入连接应该由a处理gen_server(甚至gen_tcp:accept应该编码)在里面gen_server),但我实际上并不想最初产生预定数量的接受传入连接的进程.这有可能吗?

Ada*_*erg 10

基本程序

您应该有一个gen_server执行以下过程的静态进程(实现为自定义进程或自定义进程):

  1. 使用侦听传入连接 gen_tcp:accept/1
  2. 每次返回连接时,告诉主管产生一个工作进程(例如另一个gen_server进程)
  3. 获取此过程的pid
  4. gen_tcp:controlling_process/2使用新返回的套接字和该pid 调用
  5. 将套接字发送到该进程

注意:必须按此顺序执行此操作,否则新进程可能会在所有权移交之前使用套接字.如果不这样做,旧进程可能会在新进程已经接管时获得与套接字相关的消息,从而导致数据包丢失或处理不当.

监听过程应该只有一个责任,即产生新连接的工人.此过程将在调用时阻止gen_tcp:accept/1,这很好,因为已启动的工作程序将同时处理正在进行的连接.阻止接受可确保启动新连接时的最快响应时间.如果进程需要在中间执行其他操作,则gen_tcp:accept/2可以与超时之间交错的其他操作一起使用.

缩放

  • 您可以gen_tcp:accept/1在单个侦听套接字上等待多个进程,从而进一步提高并发性并最大限度地减少接受延迟.

  • 另一个优化是预先启动一些套接字工作程序,以在接受新套接字后进一步减少延迟.