来自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内核决定“竞争”的结果时它是相同的。
答案 0 :(得分:4)
我也在Erlang Questions邮件列表中发布了这个问题。 正如 Daniel Goertzen 所指出的, Erlang中有受众池库,例如ranch和swarm。
ranch 与Unicorn的工作方式不同,它只在许多进程中“接受”,然后将套接字传递给某个工作进程。
swarm 的工作方式与Unicorn的意义相同 接受者和工人结合在一起。 (感谢LoïcHoguin指出) 但它们有点不同,因为swarm可以接受新的套接字 并行处理接受的套接字,而Unicorn 仅在处理接受的套接字后才接受
我更喜欢群体风格,因为它既适合快速又慢 请求,而Unicorn需要快速请求。
而不是试图有效地为慢客户服务,独角兽 依靠缓冲反向代理来有效地处理慢速 客户端。
独角兽并不适合所有应用程序。独角兽是优化的 CPU /内存/磁盘密集型应用程序,花费很少时间 等待外部资源(例如数据库服务器或外部资源) API)。
对于Comet / reverse-HTTP /推送应用程序来说,独角兽的效率非常低 HTTP连接花费大量时间空闲的地方。