RocketMQ高手之路系列之一:RocketMQ网络通信模块架构

x33g5p2x  于2021-12-19 转载在 其他  
字(2.2k)|赞(0)|评价(0)|浏览(282)

引言

本文主要是介绍RocketMQ的通信模块,通过对于源码的阅读,拆解其中的底层通信原理。一篇文章很难完全讲清楚这其中的道道,所以会分几篇文章来进行阐述。

  • 模块介绍
  • 为何使用Netty通信作为底层通信框架
  • 总结

一、模块介绍

Remoting模块的类结构图如下所示:

其中RemotingService是顶层接口,该接口中提供了三个方法如下所示:

public interface RemotingService {
    void start();

    void shutdown();

    void registerRPCHook(RPCHook rpcHook);
}

其中RemotingClientRemotingSever同时继承了顶层接口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;

}

NettyRemotingAbstractNetty通信处理的抽象类,定义并封装了Netty处理的公共处理方法;

NettyRemotingClient以及NettyRemotingServer:分别实现了RemotingClientRemotingServer,都继承了NettyRemotingAbstract抽象类。RocketMQ中其他的组件(如clientnameServerbroker在进行消息的发送和接收时均使用这两个组件)。

二、为何使用Netty通信作为底层通信框架

在看RocketMQ中的reomoting模块时,我们可以发现它的RPC调用部分是通过Netty来进行封装实现的。Netty是一个异步事件驱动的网络通信应用程序框架,通过它可以快速开发可维护的高性能协议服务器和客户端。详细的介绍这里不会再展开,后面会通过专题进行详细介绍。大致的结构如下所示:

现在的问题是,RocketMQ为什么选择Netty作为其底层通信框架呢?那可能要从Netty的优点来说了,我相信大多数框架选择其作为通信框架的原因。总结其中的优点如下:
1Netty实现了对于JDK的NIO的封装,这样就屏蔽了NIO的复杂概念以及繁琐的编程细节,不需要再关心SelectorServerSocketChannelSocketChannelByteBuffer等这些细节,对于开发者来说更加容易上手;
2Netty已经在多个开源项目(HadoopRPC框架avro使用Netty作为通信框架)中都得到了充分验证,健壮性/可靠性比较好;
3Netty框架内部对线程,selector做了一些细节的优化,精心设计的reactor多线程模型,可以实现非常高效地并发处理;
4Netty解决了(准确地说应该是采用了另一种方式完美规避了)JDK NIO的Bug(Epoll bug,会导致Selector空轮询,最终导致CPU 100%);
5、对于开发者来说,我们可以根据业务的要求进行定制化开发,通过NettyChannelHandler对通信框架进行灵活的定制化扩展;

三、总结

本文主要介绍了RocketMQ的大致代码结构,以及为什么选择Netty作为其底层的通信框架。后续的文章中再深入阐述其中的实现细节。

上一篇:开篇

相关文章