受体池和负载均衡在二郎山?(Acceptor pooling and load balancing

2019-08-05 07:21发布

从http://www.erlang.org/doc/man/gen_tcp.html#accept-1 :

值得注意的是,接受呼叫不必从插座所有者进程发出。 使用5.5.3版和仿真器的更高,多个同时接听电话可以从不同的流程,这使得受体工艺处理传入的连接池发出。

(Q1)这是否意味着我们可以有麒麟风格的负载均衡在二郎山?

(Q2)如果是这样,是否有利用此功能的任何现有的服务器或库?

(Q3)独角兽工作,请求的处理速度快的假设下。 在相同的假设,是有可能通过在二郎山结合受体和工人,以获得更好的性能?

对于那些谁不熟悉的独角兽,它是一个传统的UNIX prefork的Web服务器。 工作进程之间的负载平衡是由操作系统内核来完成。 所有工人共用一套监听套接字和做非阻塞接受()他们。 内核将决定哪个工作进程给予插座和工人睡觉,如果没有要接受()。 对于单个监听器插座,我相信这是相同的,当工作进程不阻塞地接受()和OS内核决定了“赛跑”的结果。

Answer 1:

我也贴用Erlang问题邮件列表这个问题。 正如丹尼尔Goertzen指出的那样,在二郎受体池库,如牧场和群 。

  • 牧场从独角兽的工作方式不同以这样的方式在许多工艺,它不仅“接受”,然后通过套接字一些工作进程。

  • 工作的方式是在这个意义上的受体和工人结合一样独角兽。 (感谢卢瓦克Hoguin用于指出),但他们是有点不同的,因为群可以接受平行的新的套接字与所述接受的套接字的处理中,接受套接字被处理后而独角兽只接受

我更喜欢群的风格,因为它是非常适合快速和慢速请求,而独角兽需要快速的请求。

相反,试图达到服务客户缓慢高效,麒麟依赖于缓存反向代理,以有效地与客户的缓慢处理。

麒麟是不适合所有的应用程序。 独角兽是对于那些CPU /内存/磁盘空间,并且很少花时间等待外部资源的应用进行了优化(如数据库服务器或外部API)。

麒麟是高度低效彗星/反向HTTP /推该HTTP连接花费大量时间空闲的应用程序。



文章来源: Acceptor pooling and load balancing in Erlang?