//
常见服务器架构 - 啊哈的日志 - 网易博客
http://4729469.blog.163.com/blog/static/38971212201311722616119/
这里的服务器指 client/server 编程中的 server。服务器常用架构包括四种:
- 多线程
- 多进程
- 基于 I/O 复用的事件循环架构
- SEDA 模式
前两种架构适用于类 web 服务器。这样的服务器只需处理来自客户端的请求,且请求间几乎是相互独立的。后两种架构适用于构造复杂的服务器,比如 Cassandra 系统中的一个节点,再比如 Redis 服务器。
多线程服务器对每个客户端来的请求生成一个新的线程来服务它。多进程服务器则生成一个新的进程。一个经常用的优化措施是使用线程池(或进程池)。
基于 I/O 复用的事件循环就是利用操作系统的 I/O 复用函数,比如 select, epoll, 采用一个主线程来监听所有的事件(网络 I/O 事件、timer 事件等),并在这个线程中调用相应的回调函数。
基于 I/O 复用的事件循环的好处之一是所有事件都在一个线程中处理,就不用考虑非常复杂的并发问题,大大简化了程序。
因为要在主线程中处理所有的事件,所以要求每个事件的处理时间必须要短。如果有些操作非常耗时,那么就要启动工作线程来处理耗时的操作,工作完成后通知主线程。一般通过管道来解决这个通信问题。(MooseFS 中的 chunkserver 就是这样做的)
SEDA 这种模式就是把对一个请求的完成过程划分为多个 stage。每一个 stage 对应一个线程池。在前面的一个 stage 完成之后就把请求扔到下一个 stage。可以把它想成一个流水作业。
SEDA 这种架构使得每个 stage 可以单独的控制和调优,这是它的一个优点。 它的缺点在于跨 stage 的控制比较难。 比如如果前一个 stage 的处理时间非常短,后一个 stage 是一个磁盘 I/O stage, 处理时间很长,那么请求就会在后一个 stage 堆积起来;划分成多个 stage 多,全局的过载控制就比较难。 Cassandra 系统中就有这个问题。
网友评论