大画 Spark :: 网络 (3)- 回复消息机制 OneWayMessage 与 RpcRequest 对比

回顾
上一篇,我们把消息如何最终传递到RpcEndpoint做了一个研究探讨,如下图所示。但留了一个小尾巴,即如果是RpcRequest的话,还需要回复消息给 client 端,这个是如何实现的呢?
https://xie.infoq.cn/article/dada8955812896dc8b4b9ff1a
本篇主旨
本篇讨论对于一个
RpcRequest,如何进行回复的操作,即下图中的 7 是如何实现的本篇还会针对
RpcRequest和OneWayMessage进行一个对比的讨论
RpcRequest 进行消息回复的处理模型
在
TransportRequestHandler中构建出一个respond方法,这个方法持有着Netty的channel,通过这个channel可以直接发送消息到对方的机器(关于 channel 的细节后续会继续铺开),这个channel也是联通 client 和 server 之间的通道从
processRpcRequest开始逐步触达的最终的端:RpcEndpoint在
RpcEndpoint中处理消息,并且调用 1 的respond方法通过
respond方法把response返回给client端
整个过程还是很简单的,而 spark 实现比较巧妙的地方在于,很多调用不是类与类之间的耦合,而是
方法的传递(scala 特性)
匿名类与闭包的结合
几个重要的数据结构
RpcResponseCallback
接口,被在TransportRequestHandler中匿名实现,作为参数向NettyRpcHandler传递
onSuccess:处理成功后被回调的方法onFailure:处理失败后被回调的方法respond:持有在TransportRequestHandler中的respond方法,被上面 2 个方法调用
RemoteNettyRpcCallContext
持有RpcResponseCallback的实例,通过reply → send → onSuccess来间接调用respond方法
全流程浮出水面
通过上述两个重要的数据结构,串联起整个流程,使得在RpcEndpoint调用receiveAndReply中可以回调onSuccess从而调用起respond,最终实现从channel发送消息给 client 端
2.1 构造
RpcResponseCallback的匿名内部类,闭包了respond方法,并传递给NettyRpcHandler2.2 继续传递到
Dispatcher中2.3 构造了
RemoteNettyRpcCallContext的上下文,其内部包含了RpcResponseCallback3.1 在
RpcEndpoint调用receiveAndReply后,匹配到相应RpcMessage,成功的场合,会调用RemoteNettyRpcCallContext的reply方法3.2 从
reply→send→respond的过程,respond后,从 channel 发送消息返还给 client 端
对比 RpcRequest 与 OneWayMessage
RpcRequest:需要回复消息给 clientOneWayMessage:不需要回复消息给 client
从以上本质的区别来讲,处理过程很好想象。是的,就是在TransportRequestHandler → NettyRpcHandler的传输过程中是否传递RpcResponseCallback,如下图所示
processRpcRequest的是RpcRequest处理方法processOneWayMessage的是OneWayMessage处理方法少传了一个
RpcResponseCallback
对RpcEndpoint来说,OneWayMessage的话,调用的是RpcEndpoint的receive的方法,即收到消息直接处理即可,不需要进行reply了。
综上,RpcRequest可以看成是业务处理层面的 TCP 协议,OneWayMessage则是 UDP。
总结
本篇较短,主要把reply的模型结构说清楚。至此,一个稍稍更清晰的 server 端的接收消息与响应的架构基本浮现在眼前
Next
下一篇,我们总结一下至今以来所总结完的过程,并且对前述的一些基础数据结构,比如EndpointData,是在什么时点如何创建的,做一些说明,从而不断向外继续延伸。
版权声明: 本文为 InfoQ 作者【dclar】的原创文章。
原文链接:【http://xie.infoq.cn/article/411fc31078553b536d9094ad4】。文章转载请联系作者。











评论