1.rpc接口
flink的rpc机制基于akka,源码位于flink项目路径flink-runtime/src/main/java/org/apache/flink/runtime/rpc。
关于akka,可以参考本博客的https://blog.youkuaiyun.com/lizhe_dashuju/article/details/98040346。
akka的通信机制本质相当简单,以本地通信为例,在本地创建一个actor,调用它的tell函数,给它传一个对象,通信结束。这个对象可以是String,也可以是用户自定义的对象。actor收到对象后,进行处理,有多种可能,可以创建新的actor,或发一个新消息给其他actor,或把新消息发给自己,如果执行出错,还可以把当前消息延迟发给自己重新处理,等等诸如此类,用法只受限于想象力。
如果需要actor输出一个返回值,不调用tell函数,调用ask函数。
如果是远程通信,创建一个远程actor,这个actor有远程主机的ip地址和端口号,通信过程一切不变,封装后一切行为跟本地调用一样。
RpcEndpoint是RPC通信各节点的抽象基类。它有三个重要的跟RPC相关的函数:
1. runAsync函数:异步执行一个Runnable接口对象。Runnalbe接口没有返回值。
2.secheduleRunAsync函数:延时执行一个Runnable接口对象。
3.callAsync函数:异步执行一个Callable接口对象。Callable接口是有返回值的。
这三个函数,都是由RpcEndpoint的成员变量rpcServer执行的,rpcServer实现了RpcServer接口。注意,rpcServer由一个RpcService接口对象启动,启动参数是RpcEndpint对象自身this。窃以为,这几个接口之间的关系有点绕,结构不清晰,画蛇添足,可能是兼容早期设计的结果。
FencedRpcEndpoint