我想创建一个代理服务器,它将来自REQ
类型套接字的传入数据包路由到群集中某台计算机上的REP
个套接字之一。我一直在阅读指南,我认为正确的结构是代理服务器上ROUTER
和DEALER
的组合。 ROUTER
将消息传递给经销商进行分发的地方。但是,我无法弄清楚如何创建此连接方案。这是正确的架构吗?如果是这样,我如何将经销商绑定到多个地址。我设想的流程就像这个REQ->ROUTER|DEALER->[REP, REP, ...]
,其中只有一个REP
套接字可以处理单个请求。
答案 0 :(得分:2)
ZeroMQ相当于某些通信行为模式的抽象层,因此虽然套接字的类似于先前读取/使用过的类似,但ZeroMQ世界与许多观点截然不同。
这种形式主义允许ZeroMQ形式通信模式在规模上增长,以高阶模式组合(用于负载平衡,用于容错,用于性能扩展)。掌握这种thinkign风格,你会忘记数据包,线程同步问题,I / O轮询并专注于基于高抽象的设计 - 关于行为 - 而不是基础细节。这使得您的设计无需重新发明轮子和轮子。非常强大,因为您可以重新使用非常专业的工具来处理您的问题域任务。
也就是说, DEALER
-node(实际上是一个ZMQsocket-access-node,行为称为“DEALER
”类似于它的队列/缓冲风格,它的循环调度程序,它的发送和预期答案模型)可以 .bind()
到多个 localhost
address:port
-s和这些“服务点”也可以在不同的 TransportClass
-es上运行 - 一个工作在< strong> tcp://
,另一个超过 inproc://
,如果这对您的设计架构有意义 - ZeroMQ使您可以使用透明的抽象方式从所有“awfull&amp; amp ;危险的“低级别的砂砾。”
原则上,在有用的情况下,可以撤消 .bind()
.connect()
和 DEALER
>到相应 REP
实体的已知目标地址。
答案 1 :(得分:2)
您留下一些对确定正确架构很重要的细节。
我将使用以下假设:
如果这些是真的,那么你想要的将更接近于此:
REQ->ROUTER|ROUTER->[REQ, REQ, ...]
工作人员将向后端路由器套接字创建一个请求,以宣布其可用性,并等待工作回复。一旦完成,它将创建一个新的请求与完成的工作,再次宣布其可用性。你已经解决过的另一半模式。
这是ZMQ指南中的Simple Pirate Pattern。这是一个很好的起点,但它不是很强大。这是在指南的可靠请求 - 回复模式部分,我建议您仔细阅读或重读该部分,因为它将指导您。特别是,他们不断将这种模式细化为越来越可靠的实现,并结合Majordomo模式,这种模式非常强大且容错。您应该看看是否需要提供的所有功能,或者是否可以将其缩小一点。无论哪种方式,在选择做不同的事情之前,你应该学习并理解这些模式正在做什么以及为什么。