基于NIO的服务器模型
最简单服务器模型是thread-per-connection,即每个客户端连接对于一个专属的工作线程,工作线程等待客户端发送数据、接收处理数据、返回响应数据然后继续等待新的数据的到来,这种模型能够保证很好的响应速度,但如果有大量并发连接会导致大量的工作线程,而且这些线程浪费了很多时间等待新数据,这些导致了这种服务器模型不适合高并发的情况。
如果服务器需要应对大量但可能并不实时活跃的连接,那么thread-on-event模型就比较适合。这种模型工作线程独立于客户端连接,只用来处理特定的事件,例如当有数据到来时(data received event),工作线程在应用级别处理这些数据提供或者启动服务。这种模型需要socket io使用非阻塞的方式,同时需要事件监测机制。这种模型被称为消息驱动模型(Reactor Pattern)。
基于NIO的消息驱动模型:
Dispatcher维护一个Selector,客户端连接注册到Selector,当有数据可读可写时,Dispatcher触发响应的事件。
通常消息驱动模型服务器的组件:
Acceptor主要负责接收新的连接请求并将其注册到Dispather中。其中维护了ServerSocketChannel,通常采用阻塞的方式。也可以用来实现连接统计,负载均衡。
Dispatcher,因为不同平台的Selector实现差异比较大,通常会使用多个(大部分服务器用了两个),用一个Dispatcherpool维护,主要负责检测SocketChannel的注册、以及读写事件。需要注意Selector的key set不是线程安全的,不同线程中更新、读取需要同步。
Dispatcher-level EventHandler 用来处理读写事件,读取数据加入到Connection的read/write queue中供后续处理。
Application-level EventHandler根据提供的服务处理队列中的数据。
该模型的简单实现
https://github.com/littlecoderonway/BaseServer.git
参考资料:
http://rox-xmlrpc.sourceforge.net/niotut/
https://today.java.net/pub/a/today/2007/02/13/architecture-of-highly-scalable-nio-server.html
http://marlonyao.iteye.com/blog/1005690