路由器/经销商代理不提供消息

时间:2016-01-22 04:13:04

标签: java zeromq jeromq

我正在处理分布式应用程序。网络基于ZMQ(jeromq),这是我的架构:

N Clients (Dealer socket) <---> (Router) Proxy (Dealer) <---> 1 (Dealer) Reciving Worker 
                                                        <---> N (Dealer) Processing Workers
  • 所以我的Receiving Worker正在一个单独的线程中运行,监听消息并将它们放入队列。
  • Processing Workers从队列中选择消息,进行一些处理并将其发送回客户端(处理工作者连接到代理后端)

当客户端发送消息时,接收工作者接收到消息,放置在队列中,处理工作人员将其接收并进行一些处理并将其发送回去,客户端会收到响应,然后发送另一个请求,接收工作者没有收到请求,但它是由客户发送的。基本上只有第一轮&#39;作品。我在这里缺少什么?!

1 个答案:

答案 0 :(得分:1)

您缺少的是经销商套接字以循环方式向任何连接的客户端发送消息。结果是你的架构不会按照你想要的方式工作。

首先,我会写一个更精确的预期架构图表(目前,我忽略了套接字类型):

Client <-----> Broker ------> Receiver
                  ^              |
                  |              |
                  \              v
                   ---------- Processor

当您发送第一条消息时,它会被发送到接收方 - ,因为它是队列中第一个连接的套接字。当您发送第二个消息时,代理上的DEALER套接字将以循环方式发送到队列中的 next 套接字,这是第一个处理器。基本上,问题是你的经纪人无法区分你的接收者&#34; socket和你的处理器&#34;套接字,它将它们视为同一个东西。

有几种方法可以解决这个问题。首先,你可能并不真正需要你的接收器&#34;作为中间人,您可以在经纪人和处理人员之间来回直接沟通。我建议首先,因为这些通常是这些类型的架构如何工作。

您还可以向代理添加另一个套接字,将一个套接字发送给接收方,另一个套接字从处理器接收。

或者,您可以使用另一个DEALER套接字替换代理上的ROUTER套接字,这样您就可以每次直接寻址接收器套接字。

跟进,以解决您的评论中的问题:

您的每个工作人员都有不同的责任,这是使用DEALER套接字替换您的经纪商的ROUTER套接字的好理由。

我的现成推荐是重新架构the Majordomo Protocol(可以找到更高版本here,并在ZMQ指南here, with Java code samples中进行了讨论)。它完全符合您的要求,并且做得很好。

但是,在更简单的层面上,您将要做的是以下内容:

  1. 调整您的经纪人,前端和后端都有ROUTER个套接字 - 这两个套接字都是bind() - ed。
  2. 调动你的工人。每个工人都知道自己的责任。移除&#34;接收器&#34;,我们不会使用它。
  3. connect()你的工人做你的经纪人。
  4. 每个工作人员向经纪人发送一条消息,告诉经纪人该工作人员负责什么。经纪人按身份记录每个工人的记录,以及工人负责的工作。
  5. 当经纪人想要发送特定工作时,它会查找哪个工作人员负责该工作,并将工作发送给该工作。
  6. 如果工人立即可用,它就可以使用它,否则它会保留在工作上,直到它准备好处理它。
  7. 当工作人员完成后,它会重新发送作业并继续处理新作业(如果有的话)。
  8. 所有这些都是Majordomo协议实现的,完成其他必要的元素,如心跳,使得完全充实的ZMQ应用程序。这就是为什么我建议您直接使用该协议,如果它满足您正在尝试完成的需求,而不是尝试构建自己的协议。