8

来自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() 并且操作系统内核决定“竞赛”的结果时,情况是一样的。

4

1 回答 1

4

我还在 Erlang Questions 邮件列表中发布了这个问题。正如Daniel Goertzen所指出的,Erlang 中有接受器池库,例如ranchswarm

  • 牧场与独角兽的工作方式不同,它只在许多进程中“接受”,然后将套接字传递给某个工作进程。

  • swarm的工作方式与 Unicorn 的工作方式相同,因为接受者和工作人员是结合在一起的。(感谢Loïc Hoguin的指出)但是它们有点不同,因为 swarm 可以在处理已接受的套接字的同时接受一个新的套接字,而 Unicorn 仅在处理已接受的套接字后才接受

我更喜欢 swarm 样式,因为它适用于快速和慢速请求,而 Unicorn 需要快速请求。

unicorn 没有试图高效地为慢速客户端提供服务,而是依靠缓冲反向代理来有效地处理慢速客户端。

独角兽并不适合所有应用程序。unicorn 针对 CPU/内存/磁盘密集型应用程序进行了优化,并且很少花费时间等待外部资源(例如数据库服务器或外部 API)。

unicorn 对于 HTTP 连接花费大量空闲时间的 Comet/reverse-HTTP/push 应用程序非常低效。

于 2013-01-03T04:06:37.080 回答