RocketMQ-网络传输与线程框架

由于工作的原因,需要在RocketMQ源码的基础上进行修改,实现自己的功能,因此打算读读源码,写写日记,后续会使用aeron替换掉netty,比较两者的性能指标。

RocketMQ主要包括NameSrv、Broker、Producer和Consumer四个模块,模块之间通过Netty进行底层网络传输,因此,RocketMQ的线程模型也是根据Netty的特点进行构建。

RocketMQ对Netty的封装

RocketMQ在原生Netty的基础上,封装了自己的Server和Client,分别为NettyRemotingServer和NettyRemotingClient,该部分的类关系如下图所示。其中NettyRemotingAbstract定义了消息在通过Netty接收并编解码为消息后的一系列业务操作;NettyRemotingServer和NettyRemotingClient是分别对Netty Server和Netty Client的接口封装。

RocketMQ对Netty的封装

以下的讲解需要首先了解一下Netty的基本使用方式,建议同学先去熟悉一下

Netty的客户端或者服务端在收到消息时,消息的数据流会流经在PipeLine上定义的所有ChannelHandler。以上文的NettyRemotingServer为例,以下代码创建了handshakeHandler、encoder、NettyDecoder、IdleStateHandler、connectionManageHandler和serverHandler总共六个ChannelHandler:

ServerBootstrap childHandler =
            this.serverBootstrap.group(this.eventLoopGroupBoss, this.eventLoopGroupSelector)
                .channel(useEpoll() ? EpollServerSocketChannel.class : NioServerSocketChannel.class)
                .option(ChannelOption.SO_BACKLOG, 1024)
                .option(ChannelOption.SO_REUSEADDR, true)
                .option(ChannelOption.SO_KEEPALIVE, false)
                .childOption(ChannelOption.TCP_NODELAY, true)
                .childOption(ChannelOption.SO_SNDBUF, nettyServerConfig.getServerSocketSndBufSize())
                .childOption(ChannelOption.SO_RCVBUF, nettyServerConfig.getServerSocketRcvBufSize())
                .localAddress(new InetSocketAddress(this.nettyServerConfig.getListenPort()))
                .childHandler(new ChannelInitializer<SocketChannel>() {
   
                    @Override
                    public void initChannel(SocketChannel ch) throws Exception {
   
                        ch.pipeline()
                            .addLast(defaultEventExecutorGroup, HANDSHAKE_HANDLER_NAME, handshakeHandler)
                            .addLast(defaultEventExecutorGroup,
                                encoder,
                                new NettyDecoder(),
                                new IdleStateHandler(0, 0, nettyServerConfig.getServerChannelMaxIdleTimeSeconds()),
                                connectionManageHandler,
                                serverHandler
                            );
                    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值