【问题标题】:ZMQ route message to specific worker in a ROUTER/DEALER architectureZMQ 将消息路由到 ROUTER/DEALER 架构中的特定工作人员
【发布时间】:2021-03-30 07:40:25
【问题描述】:

当我们有多个客户端请求多个服务时,如何在 zeromq 提出的 ROUTER/DEALER 架构中向特定工作人员发送消息? 更具体地说,如果我们在 ZMQ_DEALER 后面有 service A service B。如何仅向service Aservice B 发送消息?

【问题讨论】:

  • 您对 ROUTER/DEALER 架构有何看法?它是一个为客户提供路由器前端和为工人提供经销商后端的经纪人吗?

标签: zeromq


【解决方案1】:

查看 ZeroMq 指南中的 Majordomo 模式

https://zguide.zeromq.org/docs/chapter4/#Service-Oriented-Reliable-Queuing-Majordomo-Pattern

Majordomo 协议 (MDP) 以一种有趣的方式扩展和改进了 PPP:它为客户端发送的请求添加了一个“服务名称”,并要求工作人员注册特定服务。添加服务名称会将我们的 Paranoid Pirate 队列变成面向服务的代理。

【讨论】:

  • 尽量不要用链接回答问题。链接可能会在一段时间内出错。
  • 可惜这仍然没有 c# 实现
【解决方案2】:

无法通过 ROUTER/DEALER 向特定工作人员发送消息。如果有的话,事情会变得非常复杂(在实施和可用性方面)。

不过,解决方案是显而易见的:将 worker 的端点以及路由器的端点暴露给客户端。如果您需要向特定工作人员发送消息 - 直接发送。如果您需要将其发送给随机工作人员 - 通过路由器发送。

【讨论】:

    【解决方案3】:

    不确定这个问题中工作人员的含义,但您当然可以通过路由器套接字向特定连接发送消息。

    例如,如果经销商套接字注册了一个身份,那么路由器可以使用该身份直接与该套接字对话 - 因此,如果您在两个经销商后面有 serviceA 和 serviceB,那么路由器可以通过在带有套接字标识的消息(并使用 SNDMORE 标志)。 例如

    ZMQ.Socket dealer = context.socket(ZMQ.DEALER); dealer.setIdentity("serviceA".getBytes());

    然后路由器套接字可以通过发送以下内容直接与该经销商对话:

    routerSocket.sendMore("serviceA".getBytes()); routerSocket.send(data)

    此解决方案存在一个问题,即 ZMQ 会记住套接字何时不再可路由(例如,出现某种网络中断或您只是重新启动了服务),并且如果它不能再将消息路由到那里,即使重新连接后。因此,使用固定字符串作为套接字标识并不是一个好主意。我倾向于使用 UUID。 告诉服务器哪个客户端/服务有哪个 UUID 现在变得更有趣了!您可以采取多种方法,但我将把它留给不同的帖子,因为它已经远离了重点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多