当我们有多个客户端请求多个服务时,如何在zeromq提出的ROUTER / DEALER体系结构中向特定工作者发送消息?
更具体地说,如果我们在ZMQ_DEALER后面有service A
service B
。如何仅向service A
或service B
发送消息?
答案 0 :(得分:3)
在ZeroMq指南中查看Majordomo模式
http://zguide.zeromq.org/page:all#Service-Oriented-Reliable-Queuing-Majordomo-Pattern
Majordomo协议(MDP)以一种有趣的方式扩展和改进了PPP:它增加了一个"服务名称"请求客户端发送,并要求工作人员注册特定服务。添加服务名称会使我们的Paranoid Pirate队列成为面向服务的代理。
答案 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现在变得更加有趣!您可以采取多种方法,但我会将其留在不同的位置,因为它远离主要观点。