之前写过一篇dubbo cluster–架构。因为dubbo逻辑集群的功能主要是在client端,主要侧重在client的分析。后来因为工作忙和懒癌,也就没再继续server的叙述了。最近正好在看大众点评的cat源码,其中也有rpc的模块,就借此专门来分析下rpc server的实现。
网络模型
Cat server基于netty,是典型的reactor模型。
上图是网上找的reactor模型示例图。Netty的boss和workder分别映射图中的mainReactor和subReactor。由boss accept nio channel,之后交由worker read, decode以及handle等。Netty的实现和图中略微有点不一致,在netty中decode和handle是同步的。
需要说明的是netty handler也可以异步处理,netty支持线程池分发handler thread。
还有另一种方案,由应用程序自身实现延迟队列做异步处理,handler只需将消息(事件)放入队列即可,cat采用的就是这种方案。Cat是通过decoder解码消息后调用handler将消息插入延迟队列,并没有向netty注册handler再由netty在decode完毕后调用相应handler。
Cat的传输数据对象为MessageTree,MessageCodec对传输消息编码和解码,MessageHanlder将消息放入队列。下图是cat server的静态结构。