简介
@H_404_2@ spymemcached 是一个 memcached 的客户端, 使用 NIO 实现。采用Reactor模式实现,单线程,高性能Memcached客户端。 @H_404_2@ spymemcached源码分析:http://my.oschina.net/astute/blog/93492Reactor模式介绍
@H_404_2@ 所谓reactor模式,其实是event-driven pattern在网络服务设计中的应用,以平衡cpu与IO速率,最大化cpu资源与IO资源的利用率; @H_404_2@ 先来看看经典的服务器设计: @H_404_2@ @H_404_2@ 经典网络服务接受客户端请求,响应请求过程可以抽象为以下步骤:- 读取请求数据 : read
- 解码数据: decode
- 计算:compute
- 编码数据:encode
- 发送数据:send
- 每个连接分配一个线程,而每个连接发送请求数据较少,导致大量空闲线程;
- 大量线程上下文切换和锁竞争
- 采用分治的思想,将连接划分为更小粒度的非阻塞任务:将用户连接划分为 多个用户请求,每个请求一个线程处理;减少 请求间空闲时间占用线程
- 采用事件处理模式,分派可执行任务;通过IO 事件触发 handler 处理
@H_404_2@ 采用事件处理模式的单线程Reactor模式: @H_404_2@ @H_404_2@ 单线程Reactor 处理 连接请求,所有用户请求都在同一个线程中;通过IO事件触发相应的操作;IO事件触发机制可参考java nio机制; @H_404_2@ 单线程版本的Reactor模式,还有以下问题: @H_404_2@ 为解决上述问题,采用多线程设计方案的Reactor模式: @H_404_2@ @H_404_2@ 多线程版本的Reactor模式,有以下优势: @H_404_2@ reactor模式就介绍到此,具体看下spymemcached中reactor模式的应用吧
spymemcached中Reactor模式实现
@H_404_2@ spymemcached中reactor模式设计到以下概念:- IO线程:MemcachedConnection 负责处理
- 工作线程:调用spymemcached操作的线程;通常是应用线程,例如tomcat线程等等;
- 通过MemcachedClient提交操作请求给MemcachedConnection
- MemachedClient提交操作过程:实例化异步操作回执OperationFuture(该回执都会实例化一个CountDownLatch(1));通过OperationFactory 生成定制Callback操作的Operation对象;将Operation操作加入对应ShardedNode 的inputQ;返回异步结果回执OperationFuture对象
- 调用OperationFuture对象的get操作阻塞在CountDownLatch,等待后台IO线程,调用countDown;
- 由MemcachedClient初始化启动后台MemcachedConnection线程,接受工作线程提交操作:从inputQ拷贝到writableQ;发送操作请求到Memcached服务器;添加操作到readQ,并把操作从writableQ删除;修改监听IO事件
- 执行select操作,获取感兴趣IO事件
- 执行handleIO处理:根据SelectKey发生事件类型:执行读取操作 or 写入操作;
- 当IO操作完成后,调用Operation Callback对象的receivedStatus设置回执结果;调用countDown释放阻塞的工作线程;
@H_404_2@ 在spymemcached的Reactor设计中: @H_404_2@ MemcachedClient负责接收请求 @H_404_2@ MemcachedConnection负责处理IO请求 @H_404_2@ 同时还可以扩展支持线程池TranscodeService对解码计算提供异步线程支持; 这也是OperationFuture.get()返回值仍未一个Futrue,内部再次调用future.get返回最终数据的原因。