ZMQ路由消息给ROUTER / DEALER体系结构中的特定工作者

时间:2013-04-02 13:29:16

标签: zeromq

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

3 个答案:

答案 0 :(得分:3)

在ZeroMq指南中查看Majordomo模式

http://zguide.zeromq.org/page:all#Service-Oriented-Reliable-Queuing-Majordomo-Pattern

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

enter image description here

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

例如,如果经销商套接字注册了身份,那么路由器可以使用身份直接与该套接字通话 - 因此,如果您在两个经销商后面有serviceA和serviceB,那么路由器可以通过在额外的帧前添加前缀来直接与任一服务通信。带有套接字标识的消息(并使用SNDMORE标志)。 e.g。

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <nav> <div class="nav-logo">Maskinfabrikken</div> <div class="nav-icon mobile-show-nav"><img src="https://cdn3.iconfinder.com/data/icons/food-and-drink-part-2/512/94-512.png"></div> <div class="nav-icon"><img src="https://cdn2.iconfinder.com/data/icons/web/512/Shopping_Cart-512.png"> </div> <div class="nav-items-container"> <ul class="nav-items"> <li>Produkter</li> <li>Arrangementer</li> <li>Kontakt</li> <li>Downloads</li> <li>Om os</li> </ul> </div> </nav>

然后,路由器套接字可以通过发送:

直接与该经销商对话

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

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