引言
本文主要是介绍RocketMQ
的通信模块,通过对于源码的阅读,拆解其中的底层通信原理。一篇文章很难完全讲清楚这其中的道道,所以会分几篇文章来进行阐述。
- 模块介绍
- 为何使用Netty通信作为底层通信框架
- 总结
一、模块介绍
Remoting
模块的类结构图如下所示:
其中RemotingService
是顶层接口,该接口中提供了三个方法如下所示:
public interface RemotingService { void start(); void shutdown(); void registerRPCHook(RPCHook rpcHook); }
其中RemotingClient
和RemotingSever
同时继承了顶层接口RemotingService
,
public interface RemotingServer extends RemotingService { void registerProcessor(final int requestCode, final NettyRequestProcessor processor, final ExecutorService executor); void registerDefaultProcessor(final NettyRequestProcessor processor, final ExecutorService executor); int localListenPort(); Pair<NettyRequestProcessor, ExecutorService> getProcessorPair(final int requestCode); RemotingCommand invokeSync(final Channel channel, final RemotingCommand request, final long timeoutMillis) throws InterruptedException, RemotingSendRequestException, RemotingTimeoutException; void invokeAsync(final Channel channel, final RemotingCommand request, final long timeoutMillis, final InvokeCallback invokeCallback) throws InterruptedException, RemotingTooMuchRequestException, RemotingTimeoutException, RemotingSendRequestException; void invokeOneway(final Channel channel, final RemotingCommand request, final long timeoutMillis) throws InterruptedException, RemotingTooMuchRequestException, RemotingTimeoutException, RemotingSendRequestException; }
NettyRemotingAbstract:Netty通信处理的抽象类,定义并封装了Netty处理的公共处理方法;
NettyRemotingClient以及NettyRemotingServer:分别实现了RemotingClient和RemotingServer,都继承了NettyRemotingAbstract抽象类。RocketMQ中其他的组件(如client、nameServer、broker在进行消息的发送和接收时均使用这两个组件)。
二、为何使用Netty通信作为底层通信框架
在看RocketMQ
中的reomoting
模块时,我们可以发现它的RPC
调用部分是通过Netty
来进行封装实现的。Netty
是一个异步事件驱动的网络通信应用程序框架,通过它可以快速开发可维护的高性能协议服务器和客户端。详细的介绍这里不会再展开,后面会通过专题进行详细介绍。大致的结构如下所示:
现在的问题是,RocketMQ为什么选择Netty作为其底层通信框架呢?那可能要从Netty的优点来说了,我相信大多数框架选择其作为通信框架的原因。总结其中的优点如下:
1、Netty实现了对于JDK的NIO的封装,这样就屏蔽了NIO的复杂概念以及繁琐的编程细节,不需要再关心Selector、ServerSocketChannel、SocketChannel、ByteBuffer等这些细节,对于开发者来说更加容易上手;
2、Netty已经在多个开源项目(Hadoop的RPC框架avro使用Netty作为通信框架)中都得到了充分验证,健壮性/可靠性比较好;
3、Netty框架内部对线程,selector做了一些细节的优化,精心设计的reactor多线程模型,可以实现非常高效地并发处理;
4、Netty解决了(准确地说应该是采用了另一种方式完美规避了)JDK NIO的Bug(Epoll bug,会导致Selector空轮询,最终导致CPU 100%);
5、对于开发者来说,我们可以根据业务的要求进行定制化开发,通过Netty的ChannelHandler对通信框架进行灵活的定制化扩展;
三、总结
本文主要介绍了RocketMQ的大致代码结构,以及为什么选择Netty作为其底层的通信框架。后续的文章中再深入阐述其中的实现细节。