我有多台服务器,在任何时候,只有一台服务器可以成为领导者,可以响应请求,而其他服务器则只是丢弃请求。问题是客户端不知道哪个服务器是领导者。
我尝试在客户端上使用pub套接字进行并行请求,但是我无法为响应确定正确的语义。在如何使服务器响应特定客户端方面。
我尝试过的一种骇人听闻的解决方案是在客户端上具有一个子套接字,以在所有服务器上发布套接字,而领导者则通过发布带有过滤器的消息来进行响应,以便仅将消息发送给客户端。
但是,我无法以这种方式接收任何响应,服务器认为它已发送了消息,而客户端认为它已订阅""
,但是什么也没收到...
所以我想知道是否有更合适的方法?我曾认为发送给特定客户的经销商/路由器可能会起作用,但是我不确定该怎么做。
本质上,我正在尝试执行标准的Req / Rep,但是与所有节点并行执行req,而不是循环执行。
更新:通过在发布请求中发送发牌人的routing id
,使远程呼叫成为幂等(反复尝试仅返回预先计算的结果),然后通过路由器将结果与消息一起发回在接收端进行过滤,现在可以正常工作。
答案 0 :(得分:1)
Q :”是(这样做)更合适的方法吗?”
是的
开始应用马斯洛的锤子规则:
“当您仅有的工具是锤子时,每个问题都开始像钉子一样。”
换句话说,请勿尝试使用(一把)锤子解决所有问题。 PUB/SUB
原型旨在服务于那些和-唯一的多方正式沟通模式原型,其中许多 {{1 }} -向SUB
记录一些 .recv()
-利落语PUB
-广播消息,但没有其他内容。
类似地,定义并实现了 .send()
原型,以便服务于唯一的一个多方分布式正式沟通模式(并且显然不会满足任何用例,它具有任何其他要求,甚至有稍微不同的要求。
用户通常需要一些特殊的,非平凡的功能,这些功能显然不是所述平凡的“形式化通信模式”原型原语(那些现成的块,可在ZeroMQ工具箱中使用)的一部分。
在大多数情况下,使用现成的ZeroMQ原语的分层组合,定义,分析和实现任何更复杂的用户特定的分布式行为定义(协议),并由其实施,这是建筑师/设计师的职责。
如果有疑问,请拿着纸和笔,在操场上画一小群孩子,画出他们的“喊叫声”,“聆听”,“沉默”,“等待”和“怀疑”,以及许多或很少的“答复”,他们的“投票”和“愤怒”,而不是被朋友投票,他们为在太阳上占一席之地而奋斗,以及“不屈不挠”,以不让其他人转而让他们坐在“释放迄今为止为止令人愉快的摇摆自身。
这是找到(协议制定的)控制水平和行动自由水平的正确组合的一部分。
我们会为您的特定用例量身定制新的分布式行为。
找到现成的原始工具来匹配并满足任何特定于用户的用例的可能性几乎无限地接近零(当然,除非一个人自己的,特定于用户的用例需求与所有原始原型都匹配,但是这不是特定于用户的用例,而是针对ZeroMQ父亲所预见的相同情况重复使用已经实现的原型,不是吗?)
再次,欢迎来到零禅艺术。