2011-05-12 38 views
4

也许问题不是那么简单的回答...但你的意见是什么?我应该既可以使用非阻断方法(libevent的用于exampe)或重量使用Erlang的光流程:彗星的最佳途径? (Non Blocking IO vs Erlang)

  1. 在RAM
  2. 一个给定的量实现尽可能多的连接,从而在一个实现尽可能多的吞吐量尽可能给定数量的CPU

背景是,我打算编写一个发布/子服务器,我不能决定我应该使用哪种方法。

回答

2

一篇关于制作A Million-user Comet Application with Mochiweb的文章,你可以在那里阅读。但我认为稳定性,灵活性和可维护性在大多数时候更为重要。记住这一点,我不会考虑除Erlang之外的其他任何东西,即使会有一些更好的解决方案。

+0

我已经知道这篇文章,他的成就非常惊人。我也知道Erlang的优点(热交换,可伸缩性等),但我的最高优先级是性能和每个连接的Ram,我的“感觉”告诉我,使用一个处理所有连接的单一事件循环(libevent)是为每个连接产生更好的Erlang进程? – 2011-05-12 12:44:58

+0

如果您每次收到处理事件的时候都会生成一个流程,那么单个事件循环有什么意义?如果你不这样做,那么你有单线程应用程序(几乎系统进程仍然是多线程),性能可能会在多核机器上受损。 – 2011-05-12 14:57:36

+1

@Filipe Santos:即使你使用单个事件循环,你也必须保持每个连接的某种状态。这个状态使用的RAM数量与一个Erlang进程所消耗的内存相当(当然,数量级不会太小)。但是您将获得多核支持,更快的开发速度等等。我会制作Erlang POC,然后测量,然后优化,然后将部分重写为NIF,然后重新测量,然后重写为自己的事件循环,然后......我敢打赌,您会对Erlang POC感到满意,并将精力集中到特性上。 – 2011-05-13 07:53:07

1

在引擎盖下,Erlang VM使用非阻塞IO。如果你使用Erlang轻量级进程块,那么虚拟机并不真正执行内核级线程上下文切换。大多数情况下,它会在同一个操作系统线程中唤醒另一个LWP(因此,它不是正确意义上的“阻塞”)。

您甚至可以使用+ A参数启动虚拟机并指定要分配多少个IO事件循环线程(AFAIK,Node.js仍然是单线程的,并且如果回调函数挂起,则完成虚拟机的虚拟机)