Erlang中的接受器池和负载平衡?

时间:2013-01-02 12:24:17

标签: performance erlang load-balancing unicorn

来自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服务器。工作进程之间的负载平衡由OS内核完成。所有工作者共享一组通用的侦听器套接字,并对它们执行非阻塞的accept()。如果没有什么可以接受(),内核将决定给哪个工作进程提供套接字,工作人员将休眠。 对于单个侦听器套接字,我相信当工作进程阻塞accept()并且OS内核决定“竞争”的结果时它是相同的。

1 个答案:

答案 0 :(得分:4)

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

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

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

我更喜欢群体风格,因为它既适合快速又慢 请求,而Unicorn需要快速请求。

  

而不是试图有效地为慢客户服务,独角兽   依靠缓冲反向代理来有效地处理慢速   客户端。

     

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

     对于Comet / reverse-HTTP /推送应用程序来说,独角兽的效率非常低   HTTP连接花费大量时间空闲的地方。