来自http://www.erlang.org/doc/man/gen_tcp.html#accept-1:
值得注意的是,接受调用不必从套接字所有者进程发出。使用 5.5.3 及更高版本的模拟器,可以从不同的进程发出多个同时接受调用,这允许一个接受器进程池处理传入连接。
(Q1)这是否意味着我们可以在 Erlang 中进行Unicorn式的负载均衡?
(Q2)如果有,是否有任何现有的服务器或库使用此功能?
(Q3) Unicorn 在请求处理快速的假设下工作。在同样的假设下,是否可以通过在 Erlang 中结合接受器和工作器来获得更好的性能?
对于不熟悉 Unicorn 的人来说,它是一个传统的 UNIX prefork web 服务器。工作进程之间的负载平衡由操作系统内核完成。所有工作人员共享一组通用的侦听器套接字,并对它们执行非阻塞的 accept()。内核将决定向哪个工作进程提供套接字,如果没有任何内容可以接受(),工作人员将进入睡眠状态。对于单个侦听器套接字,我相信当工作进程阻塞 accept() 并且操作系统内核决定“竞赛”的结果时,情况是一样的。