将zmq经销商绑定到多个回复者

时间:2014-10-27 21:51:48

标签: asynchronous routing zeromq distributed-computing server

我想创建一个代理服务器,它将来自REQ类型套接字的传入数据包路由到群集中某台计算机上的REP个套接字之一。我一直在阅读指南,我认为正确的结构是代理服务器上ROUTERDEALER的组合。 ROUTER将消息传递给经销商进行分发的地方。但是,我无法弄清楚如何创建此连接方案。这是正确的架构吗?如果是这样,我如何将经销商绑定到多个地址。我设想的流程就像这个REQ->ROUTER|DEALER->[REP, REP, ...],其中只有一个REP套接字可以处理单个请求。

2 个答案:

答案 0 :(得分:2)

注意:忘记数据包 - 从“行为”的角度来看,这是关键

ZeroMQ相当于某些通信行为模式的抽象层,因此虽然套接字的类似于先前读取/使用过的类似,但ZeroMQ世界与许多观点截然不同。

这种形式主义允许ZeroMQ形式通信模式在规模上增长,以高阶模式组合(用于负载平衡,用于容错,用于性能扩展)。掌握这种thinkign风格,你会忘记数据包,线程同步问题,I / O轮询并专注于基于高抽象的设计 - 关于行为 - 而不是基础细节。这使得您的设计无需重新发明轮子和轮子。非常强大,因为您可以重新使用非常专业的工具来处理您的问题域任务。

DEALER-> [REP,REP,...]段

也就是说, DEALER -node(实际上是一个ZMQsocket-access-node,行为称为“DEALER”类似于它的队列/缓冲风格,它的循环调度程序,它的发送和预期答案模型)可以 .bind() 到多个 localhost address:port -s和这些“服务点”也可以在不同的 TransportClass -es上运行 - 一个工作在< strong> tcp:// ,另一个超过 inproc:// ,如果这对您的设计架构有意义 - ZeroMQ使您可以使用透明的抽象方式从所有“awfull&amp; amp ;危险的“低级别的砂砾。”

ZeroMQ还允许反转.connect()/ .bind()

原则上,在有用的情况下,可以撤消 .bind() .connect() DEALER >到相应 REP 实体的已知目标地址。

答案 1 :(得分:2)

您留下一些对确定正确架构很重要的细节。

  • 当您说“从REQ类型套接字到群集中某台计算机上的某个REP套接字”时,您如何确定哪些计算机获取该消息?它是针对特定的计算机吗?计算机在收到消息之前是否宣布其可用性?每条消息是否以循环方式传递给下一个消息? (如果不是最后一个,你可能不需要经销商插座)
  • 当您说“我如何将经销商绑定到多个地址”时,“地址”的含义并不清楚...您是说代理具有用于与之通信的唯一IP地址群集中的每台计算机?或者您只是想知道如何使用相同的套接字管理与多个不同对等体的连接?前者是特例,后者很简单。

我将使用以下假设:

  1. 您希望群集中的工作计算机在收到任何工作之前宣布其工作可用性,并且群集中的任何计算机都可以处理任何作业。一个工作较快的工人或从事较小工作的工人,不必等待一些缓慢的工人完成工作并先获得新工作。
  2. 代理/经纪人使用单个IP接口与所有员工进行通信。
  3. 如果这些是真的,那么你想要的将更接近于此:

    REQ->ROUTER|ROUTER->[REQ, REQ, ...]
    

    工作人员将向后端路由器套接字创建一个请求,以宣布其可用性,并等待工作回复。一旦完成,它将创建一个新的请求与完成的工作,再次宣布其可用性。你已经解决过的另一半模式。

    这是ZMQ指南中的Simple Pirate Pattern。这是一个很好的起点,但它不是很强大。这是在指南的可靠请求 - 回复模式部分,我建议您仔细阅读或重读该部分,因为它将指导您。特别是,他们不断将这种模式细化为越来越可靠的实现,并结合Majordomo模式,这种模式非常强大且容错。您应该看看是否需要提供的所有功能,或者是否可以将其缩小一点。无论哪种方式,在选择做不同的事情之前,你应该学习并理解这些模式正在做什么以及为什么。