zerorpc 详解.md

ZeroRPC采用ZeroMQ消息队列及msgpack序列化技术,实现跨语言远程调用功能,支持ROUTER-DEALER和PUB-SUB通信模式,模仿GRPC的请求-响应和流式RPC。本文详解其心跳、缓存队列大小沟通机制,以及Server启动流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

zerorpc 是利用 zeroMQ消息队列 + msgpack 消息序列化(二进制) 来实现类似 grpc 的功能,跨语言远程调用。

主要使用到 zeroMQ 的通信模式是 ROUTER–DEALER,模拟 grpc 的 请求-响应式 和 应答流式 RPC :

zerorpc 还支持 PUB-SUB 通信模式的远程调用

zerorpc 的 UML 图(大体):
在这里插入图片描述

Server 端向 Client 端发送的 event name 有:

  • _zpc_hb: 心跳event name(若 protocol = 2 那么还有沟通队列大小的功能)
  • _zpc_more: Server 与Client 沟通缓存队列大小(若 protocol = 2,那么 要使用 _rpc_hb
  • OK:正常 REP 响应
  • ERR:异常 REP 响应
  • STREAM: 这是一个流响应( 模拟http2 中的 stream)
  • STREAM_DONE: 说明该流响应结束

Client 端 向 Server 端发送的 event name 有:

  • _zpc_hb: 心跳event name(若 protocol = 2 那么还有沟通队列大小的功能)
  • _zpc_more: Server 与Client 沟通缓存队列大小(若 protocol = 2,那么 要使用 _rpc_hb)
  • function name 就是要请求的函数名称

Server 启动流程:

  • Server 继承自 SocketBase 和 ServerBase:
  • 首先初始化 SocketBase:
    • 实例化 Context:定义了 msgid 范围、注册中间件(钩子)、zmq.socket
    • 实例化 Events:来管理所有 event
  • 然后初始化 ServerBase :
    • 实例化 ChannelMultiplexer(channel) 作为 Server 的多路复用器(channel 是 SocketBase 实例化的 events);
      • 如果支持接收数据 并且 没有忽略广播, 则创建 _channel_dispatcher 频道调度器 协程,_channel_dispatcher 接收没有 channel_id 的 initial_event 和 包含 channel_id 的 event并分发到与channel_id 相对应的 channel 消息队列中;
      • channel 由 ChannelMultiplexer 来创建;
    • 使用 _filter_methods 来过滤掉 methods 中的属性以及私有方法,过滤后 methods 有类变为字典类型;
    • 使用 _inject_builtins 注入一些辅助函数(都以 _ 开头),比如 _zerorpc_list_zerorpc_name_zerorpc_args等;
    • run() 是服务的开始, 创建协程来执行 _acceptor 方法(死循环)来接收 initial_event (来自 ChannelMultiplexer);
    • 每接收到一个 initial_event 就创建一个协程(_async_task方法)来处理 initial_event
    • _async_task 中根据 initial_event 来 创建 channel,发送心跳接收心跳帧,执行 function 并发送结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值