Spark RPC之Dispatcher、Inbox、Outbox

概要

DispatcherInboxOutbox完成了Spark RPC底层对请求消息的分发及处理流程,Dispatcher和Inbox作用于server端,处理请求,Outbox作用于client端,处理和远端netty server通信的情况。

Dispatcher、Inbox

Dispatcher

查看定义及UML


Dispatcher主要职责如下:

  1. 内部使用集合endpointsendpointRefs维护EndpointEndpointRef,对外通过registerRpcEndpointremoveRpcEndpointRefgetRpcEndpointRef等方法提供Endpoint注册删除和获取EndpointRef等服务。
  2. 利用EndpointDataInbox结构完成消息的存储。
  3. 创建线程池threadpool,执行MessageLoop线程,消费消息。

Inbox

Inbox绑定了消息InboxMessage和其对应的消费者Endpoint。查看其定义


Inbox的作用:

  1. 内部了维护了链表messages,用于存储消息,同时维护该消息对应消费者Endpoint
  2. 提供了postprocess两个方法,分别用于添加消息到messages和消费消息,process方法在MessageLoop中被调用。

消息类型为InboxMessage,其子类如下

EndpointData

EndpointData定义请参考第一幅截图,对Inbox进行了简单封装。

最后,Dispatcher、Inbox分发处理请求如下所示,完整的请求处理请参考Spark RPC之RpcRequest请求处理流程 后两幅截图。

简单表示如下,参考自Spark Network 模块分析

Outbox

Outbox作用于client端,当RpcEndpointRef请求RpcEndpoint时,若RpcEndpointRefRpcEndpoint位于同一机器时,走的是Inbox的逻辑,参考 Spark RPC之RpcRequest请求处理流程 最后一张截图。否则,即RpcEndpointRefRpcEndpoint不在一台机器,则RpcEndpointRef将信息发送到Outbox。
查看其定义


如上,和Inbox类似,Outbox内部也维护了messages用于存储消息,此外还有TransportClient,用于和相应的netty server通信。方法send用于将消息添加到messages并调用drainOutbox方法消费消息。

Outbox对应的消息类型为OutboxMessage,对应子类如下[RpcOutboxMessage处理有返回值的情况]

Outbox处理消息过程如下

Inbox略有不同,OutBox并没有启动单独线程MessageLoop,仅是在方法中消费,最终调用TransportClient的send或sendRpc方法发送消息。

简单表示如下,参考自Spark Network 模块分析

如上图,endpointRef、OutBox、TransportClient是根据RpcAddress一一对应的,意思是当一个节点需要和多个节点通信时,会为每个节点创建对应的OutBox,由outboxes集合维护,同时每个OutBox对象内创建对应的要访问节点的TransportClient,如下

总结

简要介绍了DispatcherInboxOutBox的组成,及作用

  1. Dispatcher、Inbox作用于server端,分发并处理EndpointRef发送的信息。
  2. OutBox作用于client端,当访问远程server时,使用TransportClient发送消息,如果访问的server在一个程序中,直接交给Dispatcher、Inbox,不需要OutBox。
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Dispatcher是一个常用的设计模式,用于将请求与处理程序进行解耦。它允许根据请求的类型将请求分发给不同的处理程序。以下是一个示例,演示了如何使用Dispatcher模式来处理不同类型的请求。 ```python class Dispatcher: def __init__(self): self.handlers = {} def add_handler(self, request_type, handler): self.handlers[request_type] = handler def dispatch(self, request): request_type = request.get('type') if request_type in self.handlers: handler = self.handlers[request_type] handler.handle(request) else: print("No handler found for request type: ", request_type) class RequestHandler: def handle(self, request): raise NotImplementedError("Subclasses must implement handle() method") class LoginHandler(RequestHandler): def handle(self, request): print("Handling login request:", request) class LogoutHandler(RequestHandler): def handle(self, request): print("Handling logout request:", request) # 创建一个Dispatcher对象 dispatcher = Dispatcher() # 创建不同类型的请求处理程序 login_handler = LoginHandler() logout_handler = LogoutHandler() # 将处理程序添加到Dispatcherdispatcher.add_handler('login', login_handler) dispatcher.add_handler('logout', logout_handler) # 创建不同类型的请求 login_request = {'type': 'login', 'username': 'user1', 'password': 'pass1'} logout_request = {'type': 'logout', 'username': 'user1'} # 分发请求 dispatcher.dispatch(login_request) dispatcher.dispatch(logout_request) ``` 这个例子中,我们创建了一个Dispatcher类,它维护了一个字典,将请求类型与处理程序进行映射。我们还创建了两个处理程序:LoginHandler和LogoutHandler,它们分别处理登录和注销请求。我们将这些处理程序添加到Dispatcher中,并通过调用dispatch方法来分发请求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值