大画 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
方法,并传递给NettyRpcHandler
2.2 继续传递到
Dispatcher
中2.3 构造了
RemoteNettyRpcCallContext
的上下文,其内部包含了RpcResponseCallback
3.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】。文章转载请联系作者。
评论