spymemcached源码中Reactor模式分析
简介spymemcached 是一个 memcached 的客户端, 使用 NIO 实现。采用Reactor模式实现,单线程,高性能Memcached客户端。 spymemcached源码分析:http://my.oschina.net/astute/blog/93492 Reactor模式介绍所谓reactor模式,其实是event-driven pattern在网络服务设计中的应用,以平衡CPU与IO速率,最大化CPU资源与IO资源的利用率; 先来看看经典的服务器设计:
经典网络服务接受客户端请求,响应请求过程可以抽象为以下步骤:
网络服务所有动作被抽象为这个五个步骤的handler;可能每个handler有单独线程执行,或者由一个线程顺序执行; 这种经典设计中存在以下问题:
为了解决上述问题,采用两个方法实现:
采用事件处理模式的单线程Reactor模式:
单线程Reactor 处理 连接请求,所有用户请求都在同一个线程中;通过IO事件触发相应的操作;IO事件触发机制可参考java nio机制; 单线程版本的Reactor模式,还有以下问题:
为解决上述问题,采用多线程设计方案的Reactor模式:
多线程版本的Reactor模式,有以下优势:
reactor模式就介绍到此,具体看下spymemcached中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返回最终数据的原因。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |