web服务器的同步与异步

最近几年node.js和tornado的流行和他们采用的是非阻塞(异步)模式有很大的关系。传统的web服务器通常采用的是同步方式,服务器的每个进程/线程每次只能处理一个请求,在遇到高并发的情况时为即使处理请求必须创建足够多的进程/线程来处理每个请求。举个简单的例子,如果每个请求的处理时间为4秒,为了支持每秒100次请求,你必须为此创建4*100个进程。创建400个进程,这个成本无疑是有些太高了。

node.js和tornado等异步服务器在接收到用户请求后,先将请求放到后台处理,等处理完成后再处理结果返回给用户。node.js和tornado都采用了类似的事件机制,可以在一个进程里并行的处理多个用户请求。在遇到高并发的情况下不需要创建多个进程/线程就可以轻松应对。也真是因此许多人认为异步模式肯定比同步模式要强,异步模式肯定要更好。

Gunicorn是一个Python WSGI HTTP服务器,同时支持同步以及异步模式。Gunicorn默认采用的是同步模式,在它的Design一节中有关于同步以及异步模式的选择说明。前面讲到同步模式下为处理高并发需要创建大量的进程,但如果每次请求的处理时间都非常短就不会出现需要创建大量进程的情况。如前面的例子中,如果每次请求的处理时间为0.1秒,则只要创建0.1×100个进程即可支持每秒100次的请求。node.js、tornado的事件机制虽然要比创建进程和线程的成本要低的多,但也不是完全没有开销的。

最后总结下:

如果服务满足一下特点时可以考虑异步服务器,不然就不是很有必要了

  • 大量的并发请求
  • 每个请求处理的耗时都比较长

3 Comments

  • feiyun
    2012年11月14号 - 5:00 下午 | Permalink

    最后的总结,是不是能这么认为,12306可以采用异步服务器?

  • 2012年11月15号 - 8:57 上午 | Permalink

    恩,12306采用异步服务器是没有问题的。不过像12306这样的服务,单靠一台服务器是肯定承受不了这么大的流量。
    所以换不换异步服务器的影响不会太大,主要还是看他们的系统构架。
    对12306来说如何可以更容易的通过增加服务器的方式来做水平扩展更为重要。

  • feiyun
    2012年11月16号 - 5:19 下午 | Permalink

    幸亏我又回过头来看这篇日志,要不然都不知道你回复了我。
    “水平扩展”, 虽不明,但总觉得跟“云计算 NoSql” 有关。

  • Comments are closed.