它包含一个地址(即 Spark URL)和名字。RpcEndpointRef 作为客户端向服务端发送请求并接收返回信息,通常可以选择使用同步或异步的方式进行发送。
Reactor 模型我们可以从一张图来看 Reactor 的架构。
使用Reactor模型,由底层netty创建的EventLoop做I/O多路复用,这里使用Multiple Reactors这种形式,如上图所示,从netty的角度而言,Main Reactor 和 Sub Reactor 对应 BossGroup 和 WorkerGroup 的概念,前者负责监听 TCP 连接、建立和断开,后者负责真正的 I/O 读写。
而图中的 ThreadPool 就是的 Dispatcher 中的线程池,它来解耦开来耗时的业务逻辑和 I/O 操作,这样就可以更 scalabe,只需要少数的线程就可以处理成千上万的连接,这种思想是标准的分治策略,offload 非 I/O 操作到另外的线程池。
DispatcherDispatcher 的主要作用是保存注册的RpcEndpoint、分发相应的Message到RpcEndPoint中进行处理。Dispatcher 即是上图中 ThreadPool的角色。它同时也维系一个 threadpool,用来处理每次接受到的 InboxMessage 。而这里处理 InboxMessage 是通过 inbox 实现的。
InboxInbox 其实属于 Actor 模型,是 Actor 中的信箱,不过它和 Dispatcher 联系紧密所以放这边。
InboxMessage 有多个实现它的类,比如 OneWayMessage,RpcMessage,等等。Dispatcher会将接收到的 InboxMessage 分发到对应 RpcEndpoint 的 Inbox 中,然后 Inbox 便会处理这个 InboxMessage 。
OK,这次就先介绍到这里,下次我们从代码的角度来看 Spark RPC 的运行机制
如果觉得对你有帮助,不妨关注一波吧~~
参考资料:https://zhuanlan.zhihu.com/p/28893155