head first in xmemcached yanf4j

18
1 Head First in Xmemcached-yanf4j Head First in Xmemcached-yanf4j Head First in Xmemcached-yanf4j Head First in Xmemcached-yanf4j Head First in Xmemcached-yanf4j Head First in Xmemcached-yanf4j Head First in Xmemcached-yanf4j Head First in Xmemcached-yanf4j Nathan Liu Nathan Liu Nathan Liu Nathan Liu http://blog.csdn.net/liu251 http://blog.csdn.net/liu251 http://blog.csdn.net/liu251 http://blog.csdn.net/liu251

Upload: wavefly

Post on 22-Jun-2015

1.711 views

Category:

Technology


8 download

DESCRIPTION

memcache java client

TRANSCRIPT

Page 1: Head first in xmemcached yanf4j

1

Head First in Xmemcached-yanf4jHead First in Xmemcached-yanf4jHead First in Xmemcached-yanf4jHead First in Xmemcached-yanf4jHead First in Xmemcached-yanf4jHead First in Xmemcached-yanf4jHead First in Xmemcached-yanf4jHead First in Xmemcached-yanf4j

Nathan Liu Nathan Liu Nathan Liu Nathan Liu http://blog.csdn.net/liu251 http://blog.csdn.net/liu251 http://blog.csdn.net/liu251 http://blog.csdn.net/liu251

Page 2: Head first in xmemcached yanf4j

2

内容大纲内容大纲内容大纲内容大纲内容大纲内容大纲内容大纲内容大纲

简介简介简介简介传输层实现传输层实现传输层实现传输层实现应用层协议应用层协议应用层协议应用层协议Q&AQ&AQ&AQ&A

Page 3: Head first in xmemcached yanf4j

3

传输层实现传输层实现传输层实现传输层实现

BIO NIO(Reactor) AIO(Proactor)BIO NIO(Reactor) AIO(Proactor)BIO NIO(Reactor) AIO(Proactor)BIO NIO(Reactor) AIO(Proactor)xmemcachexmemcachexmemcachexmemcache中的使用:事件抽象中的使用:事件抽象中的使用:事件抽象中的使用:事件抽象xmemcachexmemcachexmemcachexmemcache的多的多的多的多SelectorSelectorSelectorSelector架构架构架构架构NIOSession-SocketChannelNIOSession-SocketChannelNIOSession-SocketChannelNIOSession-SocketChannel消息传输流程消息传输流程消息传输流程消息传输流程

Page 4: Head first in xmemcached yanf4j

I/O modelsI/O modelsI/O modelsI/O models

《Unix Network Programming》 Chapter 6.2 I/O Models

Page 5: Head first in xmemcached yanf4j

5

I/O models I/O models I/O models I/O models I/O models I/O models I/O models I/O models SocketSocketSocketSocket编程,编程,编程,编程,KeyWord:KeyWord:KeyWord:KeyWord:

Read RequestRead RequestRead RequestRead RequestDecode RequestDecode RequestDecode RequestDecode RequestProcess ServiceProcess ServiceProcess ServiceProcess ServiceEncode ReplyEncode ReplyEncode ReplyEncode ReplyWrite ReplyWrite ReplyWrite ReplyWrite Reply

Page 6: Head first in xmemcached yanf4j

6

I/O models BIOI/O models BIOI/O models BIOI/O models BIOI/O models BIOI/O models BIOI/O models BIOI/O models BIOBIOBIOBIOBIO经典代码经典代码经典代码经典代码

1、每个线程分配独立的堆栈空间,随着工作线程的增多,加大了JVM调度线程的负担2、工作线程的时间浪费在I/O阻塞上3、工作线程数量超过极限,降低服务器的效率

Page 7: Head first in xmemcached yanf4j

7

I/O models BIOI/O models BIOI/O models BIOI/O models BIOI/O models BIOI/O models BIOI/O models BIOI/O models BIOClassic Service DesignsClassic Service DesignsClassic Service DesignsClassic Service Designs

Page 8: Head first in xmemcached yanf4j

8

I/O modelsI/O modelsI/O modelsI/O modelsI/O modelsI/O modelsI/O modelsI/O modelsNIONIONIONIO流程流程流程流程

Page 9: Head first in xmemcached yanf4j

9

I/O modelsI/O modelsI/O modelsI/O modelsI/O modelsI/O modelsI/O modelsI/O modelsNIONIONIONIO流程流程流程流程

注意:1、获取key要将remove,避免就绪的key下次被触发2、注册OP_WRITE事件 vs SocketChannel.write 线程竞争

Page 10: Head first in xmemcached yanf4j

10

I/O modelsI/O modelsI/O modelsI/O modelsI/O modelsI/O modelsI/O modelsI/O models

NIO Trick and TrapNIO Trick and TrapNIO Trick and TrapNIO Trick and Trap(示例代码(示例代码(示例代码(示例代码EchoServerEchoServerEchoServerEchoServer、、、、EchoServer2.EchoServer2.EchoServer2.EchoServer2.通过通过通过通过telnet 127.0.0.1 8000telnet 127.0.0.1 8000telnet 127.0.0.1 8000telnet 127.0.0.1 8000测试)测试)测试)测试)1111、获取、获取、获取、获取keykeykeykey要将要将要将要将removeremoveremoveremove,避免就绪的,避免就绪的,避免就绪的,避免就绪的keykeykeykey下下下下次被触发次被触发次被触发次被触发2222、注册、注册、注册、注册OP_WRITEOP_WRITEOP_WRITEOP_WRITE事件事件事件事件 vsvsvsvs SocketChannel.write SocketChannel.write SocketChannel.write SocketChannel.write 线程竞争线程竞争线程竞争线程竞争3333、注册事件、注册事件、注册事件、注册事件register register register register vsvsvsvs inerestOps inerestOps inerestOps inerestOpskey.interestOps(key.interestOps()&~SelectionKey.OP_WRITE);key.interestOps(key.interestOps()&~SelectionKey.OP_WRITE);key.interestOps(key.interestOps()&~SelectionKey.OP_WRITE);key.interestOps(key.interestOps()&~SelectionKey.OP_WRITE);

key.interestOps(key.interestOps() | SelectionKey.OP_WRITE);key.interestOps(key.interestOps() | SelectionKey.OP_WRITE);key.interestOps(key.interestOps() | SelectionKey.OP_WRITE);key.interestOps(key.interestOps() | SelectionKey.OP_WRITE);

Page 11: Head first in xmemcached yanf4j

11

NIO-ReactorNIO-ReactorNIO-ReactorNIO-ReactorNIO-ReactorNIO-ReactorNIO-ReactorNIO-Reactor

NIO NIO NIO NIO 编程模式:编程模式:编程模式:编程模式:ReactorReactorReactorReactor一般地一般地一般地一般地,I/O,I/O,I/O,I/O多路复用机制依赖于一个事件多路分离器多路复用机制依赖于一个事件多路分离器多路复用机制依赖于一个事件多路分离器多路复用机制依赖于一个事件多路分离器(Event(Event(Event(Event    Demultiplexer)Demultiplexer)Demultiplexer)Demultiplexer)。。。。

开发人员预先注册需要处理的事件及其事件处理器(回开发人员预先注册需要处理的事件及其事件处理器(回开发人员预先注册需要处理的事件及其事件处理器(回开发人员预先注册需要处理的事件及其事件处理器(回调函数)调函数)调函数)调函数)分离器对象将来自事件源的分离器对象将来自事件源的分离器对象将来自事件源的分离器对象将来自事件源的I/OI/OI/OI/O事件分离出来,并分发到事件分离出来,并分发到事件分离出来,并分发到事件分离出来,并分发到对应的对应的对应的对应的read/writeread/writeread/writeread/write事件处理器事件处理器事件处理器事件处理器(Event(Event(Event(Event    Handler)Handler)Handler)Handler)两个与事件分离器有关的模式是两个与事件分离器有关的模式是两个与事件分离器有关的模式是两个与事件分离器有关的模式是ReactorReactorReactorReactor和和和和ProactorProactorProactorProactor。。。。ReactorReactorReactorReactor模式采用同步模式采用同步模式采用同步模式采用同步IOIOIOIO,而,而,而,而ProactorProactorProactorProactor采用异步采用异步采用异步采用异步IOIOIOIO。。。。

JavaJavaJavaJava的的的的NIONIONIONIO为为为为reactorreactorreactorreactor模式提供了实现的基础机制,它的模式提供了实现的基础机制,它的模式提供了实现的基础机制,它的模式提供了实现的基础机制,它的SelectorSelectorSelectorSelector当发现某个当发现某个当发现某个当发现某个channelchannelchannelchannel有数据时,会通过有数据时,会通过有数据时,会通过有数据时,会通过SlectorKeySlectorKeySlectorKeySlectorKey来告知我们,在此我们实现事件和来告知我们,在此我们实现事件和来告知我们,在此我们实现事件和来告知我们,在此我们实现事件和handlerhandlerhandlerhandler的的的的绑定。绑定。绑定。绑定。

Page 12: Head first in xmemcached yanf4j

12

NIO-ReactorNIO-ReactorNIO-ReactorNIO-ReactorNIO-ReactorNIO-ReactorNIO-ReactorNIO-Reactor

NIO NIO NIO NIO 编程模式:编程模式:编程模式:编程模式:ReactorReactorReactorReactor

Page 13: Head first in xmemcached yanf4j

13

NIO-ReactorNIO-ReactorNIO-ReactorNIO-ReactorNIO-ReactorNIO-ReactorNIO-ReactorNIO-Reactor

示例代码示例代码示例代码示例代码: reactor Package: reactor Package: reactor Package: reactor Package

Page 14: Head first in xmemcached yanf4j

14

NIO-ReactorNIO-ReactorNIO-ReactorNIO-ReactorNIO-ReactorNIO-ReactorNIO-ReactorNIO-Reactor在示例代码中在示例代码中在示例代码中在示例代码中ReactorReactorReactorReactor所在的线程负责所有的逻辑处理。所在的线程负责所有的逻辑处理。所在的线程负责所有的逻辑处理。所在的线程负责所有的逻辑处理。Reactor.selectorReactor.selectorReactor.selectorReactor.selector主要注册主要注册主要注册主要注册3333个事件个事件个事件个事件:OP_WRITE OP_READ :OP_WRITE OP_READ :OP_WRITE OP_READ :OP_WRITE OP_READ OP_ACCEPT, OP_ACCEPT, OP_ACCEPT, OP_ACCEPT, 可以用不同的线程来处理这些事件可以用不同的线程来处理这些事件可以用不同的线程来处理这些事件可以用不同的线程来处理这些事件....

dispatchAcceptEventdispatchAcceptEventdispatchAcceptEventdispatchAcceptEventdispatchReadEventdispatchReadEventdispatchReadEventdispatchReadEventdispatchWriteEventdispatchWriteEventdispatchWriteEventdispatchWriteEvent

这这这这3333个方法使用线程来完成处理(要注个方法使用线程来完成处理(要注个方法使用线程来完成处理(要注个方法使用线程来完成处理(要注意同步、线程上下文切换的开销)意同步、线程上下文切换的开销)意同步、线程上下文切换的开销)意同步、线程上下文切换的开销)

在访问量大的情况下,推荐使用专门的线程来分别完成在访问量大的情况下,推荐使用专门的线程来分别完成在访问量大的情况下,推荐使用专门的线程来分别完成在访问量大的情况下,推荐使用专门的线程来分别完成OP_READ OP_ACCEPTOP_READ OP_ACCEPTOP_READ OP_ACCEPTOP_READ OP_ACCEPT事件。在事件。在事件。在事件。在xmemcachexmemcachexmemcachexmemcache中,由中,由中,由中,由reactorreactorreactorreactor线程完成线程完成线程完成线程完成OP_ACCEPTOP_ACCEPTOP_ACCEPTOP_ACCEPT事件,单独的线程处理事件,单独的线程处理事件,单独的线程处理事件,单独的线程处理OP_READOP_READOP_READOP_READ事件(逻辑处理比较耗时)事件(逻辑处理比较耗时)事件(逻辑处理比较耗时)事件(逻辑处理比较耗时)一个一个一个一个ReactorReactorReactorReactor线程对应一个线程对应一个线程对应一个线程对应一个SelectorSelectorSelectorSelector实例,采用多实例,采用多实例,采用多实例,采用多selector/reactorselector/reactorselector/reactorselector/reactor架构能够增加吞吐率。架构能够增加吞吐率。架构能够增加吞吐率。架构能够增加吞吐率。xmemcachexmemcachexmemcachexmemcache中,中,中,中,ReactorReactorReactorReactor线程数量线程数量线程数量线程数量=CPU=CPU=CPU=CPU数量数量数量数量

Page 15: Head first in xmemcached yanf4j

15

NIO-ReactorNIO-ReactorNIO-ReactorNIO-ReactorNIO-ReactorNIO-ReactorNIO-ReactorNIO-Reactorxmemcachexmemcachexmemcachexmemcache中,用数组来维护中,用数组来维护中,用数组来维护中,用数组来维护ReactorReactorReactorReactor线程组,第一个线程组,第一个线程组,第一个线程组,第一个数组元素处理数组元素处理数组元素处理数组元素处理OP_ACCEPT | OP_CONNECTOP_ACCEPT | OP_CONNECTOP_ACCEPT | OP_CONNECTOP_ACCEPT | OP_CONNECT事件。其余事件。其余事件。其余事件。其余ReactorReactorReactorReactor负责处理负责处理负责处理负责处理OP_WRITE OP_READOP_WRITE OP_READOP_WRITE OP_READOP_WRITE OP_READ事件,以及自定事件,以及自定事件,以及自定事件,以及自定义的义的义的义的EANBLE_WRITE ENABLE_READ IDLE EXPIRED EANBLE_WRITE ENABLE_READ IDLE EXPIRED EANBLE_WRITE ENABLE_READ IDLE EXPIRED EANBLE_WRITE ENABLE_READ IDLE EXPIRED REGISTER UNREGISTERREGISTER UNREGISTERREGISTER UNREGISTERREGISTER UNREGISTER事件。事件。事件。事件。

OP_WRITE OP_READ OP_ACCEPTOP_WRITE OP_READ OP_ACCEPTOP_WRITE OP_READ OP_ACCEPTOP_WRITE OP_READ OP_ACCEPT事件是由事件是由事件是由事件是由操作系统触发的,操作系统触发的,操作系统触发的,操作系统触发的,controllercontrollercontrollercontroller处理完后,再由处理完后,再由处理完后,再由处理完后,再由SessionSessionSessionSession处理。在处理这些事件的过程中可能会处理。在处理这些事件的过程中可能会处理。在处理这些事件的过程中可能会处理。在处理这些事件的过程中可能会产生产生产生产生ENABLE_WRITE ENABLE_READ READBLE ENABLE_WRITE ENABLE_READ READBLE ENABLE_WRITE ENABLE_READ READBLE ENABLE_WRITE ENABLE_READ READBLE WRITABLEWRITABLEWRITABLEWRITABLE事件。事件。事件。事件。SessionSessionSessionSession处理处理处理处理xmemcachexmemcachexmemcachexmemcache抽象的事件抽象的事件抽象的事件抽象的事件----EventTypeEventTypeEventTypeEventType

Page 16: Head first in xmemcached yanf4j

16

NIO

-Reactor

NIO

-Reactor

NIO

-Reactor

NIO

-Reactor

NIO

-Reactor

NIO

-Reactor

NIO

-Reactor

NIO

-Reactor

Page 17: Head first in xmemcached yanf4j

17

NIO-ReactorNIO-ReactorNIO-ReactorNIO-ReactorNIO-ReactorNIO-ReactorNIO-ReactorNIO-Reactor类图类图类图类图类图类图类图类图

类图

Page 18: Head first in xmemcached yanf4j

18

Q&AQ&AQ&AQ&AQ&AQ&AQ&AQ&A