【问题标题】:How to implement oneway RPC calls via ZeroMQ如何通过 ZeroMQ 实现单向 RPC 调用
【发布时间】:2015-12-08 00:57:01
【问题描述】:

在我们的分布式系统中,有本地和 .NET 组件,有一个代理,它既充当网络拓扑浏览器,又充当消息路由器。 传输和序列化由内部开发的组件提供 - 它丑陋且有缺陷。

我正在寻找提供 RPC 或消息传递以及序列化的解决方案。

我不需要 AMQP 代理,因为它需要额外管理交换和队列。

此外,我不需要系统中的消息持久性 - 每条这样的消息都只具有实时价值。

我知道 Thrift 提供 RPC 和序列化 - 它只对我部分有效,因为我们系统中的某些通信基于 PUB/ SUB 模式,而Thrift 不适合这种情况。

ZeroMQ 消息模式中的哪一种适合单向(异步)调用?

我们系统中的某些组件执行单向请求(这不是数据分发,所以ZeroMQPUB/SUB 套接字不适合这里,我认为)。

ZeroMQ REQ/REP 套接字也不是选项。也许其他一些模式?

【问题讨论】:

  • 您已经淘汰了 Thrift,因为它不支持 PUB/SUB,而且您不想同时使用两者。所以本质上,剩下的唯一问题是:我应该选择什么样的模式来通过 ZMQ 进行简单的 RPC 调用? 可以这样总结吗?然后你应该相应地修改问题。
  • 您可以使用经销商对经销商或推拉。但如果你有两种方式和一种方式,我建议使用经销商路由器。当消息是一种方式时不要回复。

标签: ipc zeromq messaging rpc thrift


【解决方案1】:

我想描述一下我的解决方案,它运行良好。正如@somdoron 建议的那样,我使用 DEALER-ROUTER 组合来发送请求(同步和单向)。

架构如下:

  • 前端DEALER 套接字来发出请求和 SUBSCRIBER 套接字来接收事件。前端只知道代理。
  • Broker 有 3 个套接字:ROUTER - 接收请求(如果需要,还可以发送回响应); PUBLISHER - 为负责处理的后端服务分发请求,也分发事件; PULL - 从后端接收处理结果。
  • Backend 服务(每个服务有不同的功能,也可以通过broker 相互通信)有3 个socket 对应broker 的socket。 SUBSCRIBER - 从代理接收命令(请求)。 DEALER - 向其他后端服务发送请求(或通知)。 PUSH - 将处理结果传输给代理。

它是如何工作的,详细说明。

  1. 前端的 DEALER 向代理发送多部分消息:M{frame[0]=command, frame[1]=body}
  2. ROUTER 收到来自前端的消息:FM{frame[0]=Identity, frame[1]=command, frame[2]=body}
  3. 转换消息 FM 以便发布到后端:PM{frame[0]=command, frame[1]=Identity, frame[2]=body},然后 PUBLISHER 会将修改后的消息分发给后端
  4. 后端的订阅者收到这样的消息(PM - 见上文),后端执行处理
  5. 消息处理时,如果需要响应,后端会创建为响应消息RM{frame[0]=Identity, frame[1]=result},并使用PUSH socket将结果发送给broker
  6. Broker 的 PULL 套接字将接收结果并将其传递给 ROUTER,因此结果消息 RM{frame[0]=Identity, frame[1]=result} 将被传递到由 Identity 标识的前端。

【讨论】:

  • 我使用单独的 PUSH-PULL 将结果从后端传输到代理,因为我不想在 ROUTER 上创建复杂的逻辑。如果后端服务 A 为了处理请求,需要向另一个服务 B 发出额外的请求,它会按照前端使用的相同方案进行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-15
  • 2020-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多