spymemcached 是一个 memcached 的客户端, 使用 NIO 实现。采用Reactor模式实现,单线程,高性能Memcached客户端。 java
spymemcached源码分析:http://my.oschina.net/astute/blog/93492 react
所谓reactor模式,实际上是event-driven pattern在网络服务设计中的应用,以平衡CPU与IO速率,最大化CPU资源与IO资源的利用率; tomcat
先来看看经典的服务器设计: 服务器
经典网络服务接受客户端请求,响应请求过程能够抽象为如下步骤: 网络
网络服务全部动做被抽象为这个五个步骤的handler;可能每一个handler有单独线程执行,或者由一个线程顺序执行; 多线程
这种经典设计中存在如下问题: 异步
为了解决上述问题,采用两个方法实现: memcached
采用事件处理模式的单线程Reactor模式: 源码分析
单线程Reactor 处理 链接请求,全部用户请求都在同一个线程中;经过IO事件触发相应的操做;IO事件触发机制可参考java nio机制; 性能
单线程版本的Reactor模式,还有如下问题:
为解决上述问题,采用多线程设计方案的Reactor模式:
多线程版本的Reactor模式,有如下优点:
reactor模式就介绍到此,具体看下spymemcached中reactor模式的应用吧
spymemcached中reactor模式设计到如下概念:
工做线程职责:
IO线程职责:
因而可知,spymemcached Reactor模式实现中,工做线程至关于客户端请求; IO线程至关于单线程Reactor设计中的Reactor负责接收请求,处理请求;spymemcached对数据解码部分能够扩展实现线程池方式提供解码计算,无需占用Reactor线程资源,使得Reactor线程满负荷IO操做和事件触发;
在spymemcached的Reactor设计中:
MemcachedClient负责接收请求
MemcachedConnection负责处理IO请求
同时还能够扩展支持线程池TranscodeService对解码计算提供异步线程支持; 这也是OperationFuture.get()返回值仍未一个Futrue,内部再次调用future.get返回最终数据的缘由。