如何通过ZeroMQ实现单向RPC调用

时间:2015-09-11 12:46:52

标签: ipc zeromq messaging rpc thrift

在我们的分布式系统中有本机和.NET组件,有一个代理既可以充当网络拓扑资源管理器,也可以充当消息路由器。 运输和序列化由内部开发的组件提供 - 它是丑陋的和错误的。

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

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

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

我知道 Thrift 提供RPC和序列化 - 它只对我有用,因为我们系统中的某些通信基于 PUB < / strong> / SUB 模式,而Thrift并不适合此。

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

我们系统中的某些组件执行单向请求(这不是数据分发,因此我认为ZeroMQ PUB / SUB套接字不适用于此处。

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

1 个答案:

答案 0 :(得分:0)

我想描述我的解决方案,它运作正常。正如@somdoron所建议的,我使用 DEALER-ROUTER 组合来发送请求(同步和单向)。

架构如下:

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

详情如何运作。

  1. 前端的经销商向经纪人发送了多部分消息: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套接字将结果发送给代理
  6. Broker的PULL套接字将接收结果并将其传递给ROUTER,因此结果消息RM{frame[0]=Identity, frame[1]=result}将被传递给Identity识别的前端。