当我们有多个客户端请求多个服务时,如何在 zeromq 提出的 ROUTER/DEALER 架构中向特定工作人员发送消息?更具体地说,如果我们service A
service B
后面有一个 ZMQ_DEALER。如何发送消息service A
或service B
仅发送消息?
3 回答
查看 ZeroMq 指南中的 Majordomo 模式
https://zguide.zeromq.org/docs/chapter4/#Service-Oriented-Reliable-Queuing-Majordomo-Pattern
Majordomo 协议 (MDP) 以一种有趣的方式扩展和改进了 PPP:它为客户端发送的请求添加了一个“服务名称”,并要求工作人员注册特定服务。添加服务名称会将我们的 Paranoid Pirate 队列变成面向服务的代理。
无法通过ROUTER/DEALER 向特定工作人员发送消息。如果有的话,事情会变得非常复杂(在实施和可用性方面)。
不过,解决方案是显而易见的:将 worker 的端点以及路由器的端点暴露给客户端。如果您需要向特定工作人员发送消息 - 直接发送。如果您需要将其发送给随机工作人员 - 通过路由器发送。
不确定这个问题中工作人员的含义,但您当然可以通过路由器套接字将消息发送到特定连接。
例如,如果经销商套接字注册了一个身份,那么路由器可以使用该身份直接与该套接字对话 - 因此,如果您在两个经销商后面有 serviceA 和 serviceB,那么路由器可以通过在消息中添加一个额外的帧来直接与任一服务对话套接字标识(并使用 SNDMORE 标志)。例如
ZMQ.Socket dealer = context.socket(ZMQ.DEALER);
dealer.setIdentity("serviceA".getBytes());
然后路由器套接字可以通过发送以下内容直接与该经销商对话:
routerSocket.sendMore("serviceA".getBytes());
routerSocket.send(data)
该解决方案存在一个问题,即 ZMQ 会记住套接字不再可路由(例如,出现某种网络中断或您只是重新启动了服务),并且即使在不能路由时也不会再将消息路由到那里。重新连接。因此,使用固定字符串作为套接字标识并不是一个好主意。我倾向于使用 UUID。告诉服务器哪个客户端/服务有哪个 UUID 现在变得更有趣了!您可以采取多种方法,但我将把它留给不同的帖子,因为它已经远离了重点。