【Spark内核源码】内置的RPC框架,Spark的通信兵(二)

目录

RPC管道处理TransportChannelHandler

RPC服务端处理RpcHandler

引导程序Bootstrap

RPC客户端TransportClient

总结


接着【Spark内核源码】内置的RPC框架,Spark的通信兵(一) 接着分析

RPC管道处理TransportChannelHandler

TransportContext最后一个作用就是使用org.apache.spark.network.server.TransportChannelHandler设置Netty Channel pipelines(Netty的通信管道)。

在TransportClientFactory的createClient方法和TransportServer的init方法中都执行了初始化管道方法,也就是TransportContext中的initializePipeline方法。

TransportClientFactory中调用initializePipeline方法
TransportServer中调用initializePipeline方法

 

initializePipeline方法的代码如下:

public TransportChannelHandler initializePipeline(
      SocketChannel channel,
      RpcHandler channelRpcHandler) {
    try {
      TransportChannelHandler channelHandler = createChannelHandler(channel, channelRpcHandler);
      /**
       * 管道设置
       * Request时按照顺序执行,TransportFrameDecoder-》MessageDecoder-》IdleStateHandler-》TransportChannelHandler
       * Response时按照逆序执行,IdleStateHandler-》MessageEncoder
       * */
      channel.pipeline()
        .addLast("encoder", encoder) //为pipeline设置encoder
        .addLast(TransportFrameDecoder.HANDLER_NAME, NettyUtils.createFrameDecoder()) //为pipeline设置frameDecoder
        .addLast("decoder", decoder) //为pipeline设置decoder
        .addLast("idleStateHandler", //为pipeline设置IdleStateHandler,Netty内置对象
                new IdleStateHandler(0, 0, conf.connectionTimeoutMs() / 1000))
        // NOTE: Chunks are currently guaranteed to be returned in the order of request, but this
        // would require more logic to guarantee if this were not part of the same event loop.
        .addLast("handler", channelHandler);
      return channelHandler;
    } catch (RuntimeException e) {
      logger.error("Error while initializing Netty pipeline", e);
      throw e;
    }
  }

首先是调用createChannelHandler方法创建TransportChannelHandler对象,createChannelHandler代码如下:

/**
   * TransportChannelHandler
   * 在服务端代理TransportRequestHandler处理请求消息
   * 在客户端代理TransportResponseHandler处理相应信息
   *
   * */
  private TransportChannelHandler createChannelHandler(Channel channel, RpcHandler rpcHandler) {
    // 创建TransportChannelHandler的同时,创建了TransportResponseHandler、TransportRequestHandler和TransportClient
    TransportResponseHandler responseHandler = new TransportResponseHandler(channel);
    // 真正意义上的创建TransportClient
    TransportClient client = new TransportClient(channel, responseHandler);
    TransportRequestHandler requestHandler = new TransportRequestHandler(channel, client,
      rpcHandler);
    return new TransportChannelHandler(client, responseHandler, requestHandler,
      conf.connectionTimeoutMs(), closeIdleConnections);
  }

创建TransportChannelHandler之前,先创建了TransportResponseHandler、TransportClient和TransportRequestHandler,在这里才是真正意义的创建TransportClient对象,与管道一一对应,保证所有用户使用channel时得到的是同一个TrasportClient对象。TransportChannelHandler在服务端代理TransportRequestHandler处理请求消息,在客户端代理TransportResponseHandler处理相应信息。创建了TransportChannelHandler之后,对管道pipeline进行设置,代码如下:

管道设置

TransportFrameDecoder、MessageDecoder、TransportChannelHandler本质上都是继承了ChannelInboundHandler,MessageEncoder本质上都是继承了ChannelOutboundHandler,IdleStateHandler本质上都是继承了ChannelInboundHandler,ChannelOutboundHandler(继承和接口实现),根据Netty中handler的执行顺序,得出如下:

Request时按照

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值