Router/Dealer 代理未传送消息

Router/Dealer proxy not delivering messages

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

N Clients (Dealer socket) <---> (Router) Proxy (Dealer) <---> 1 (Dealer) Reciving Worker 
                                                        <---> N (Dealer) Processing Workers

当客户端发送消息时,它被接收工作人员接收,放入队列中,处理工作人员将其拾取并进行一些处理并将其发回,客户端收到响应后发送另一个请求,该请求未被接收工作人员接收,而是由客户端发送。基本上只有第一个 'round' 有效。我在这里错过了什么?!

您缺少的是 Dealer 套接字以循环方式向 任何 连接的客户端发送消息。结果是您的体系结构不会按您预期的方式工作。

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

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

当您发送第一条消息时,它会被发送到接收方 - 因为它是队列中第一个连接的套接字。当您发送 second 消息时,您代理上的 DEALER 套接字正在发送到队列中的 next 套接字,在 round-robin时尚,这是第一个处理器。基本上,问题是您的经纪人无法区分您的 "receiver" 套接字和 "processor" 套接字,它将它们都视为同一件事。

有几种方法可以解决这个问题。首先,你可能并不真的需要你的 "receiver" 套接字作为 go-between,你可以直接在你的经纪人和你的处理工人之间来回沟通。我建议首先这样做,因为这通常是这些类型的架构的工作方式。

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

或者,您可以将代理上的 DEALER 套接字替换为另一个 ROUTER 套接字,这将允许您每次都直接寻址接收方套接字。


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

您的每个工作人员都有不同的责任,这是用 ROUTER 套接字替换代理上的 DEALER 套接字的一个很好的理由。

我的 off-the-shelf 建议是重新构建 the Majordomo Protocol (later version can be found here, and talked about in the ZMQ guide here, with Java code samples)。它完全符合您的要求,而且做得很好。

但是,在更简单的层面上,您要做的是:

  1. 启动你的代理,前端和后端都有 ROUTER 个套接字 - 这两个套接字都是 bind()-ed。
  2. 启动你的工人。每个工人都知道自己的责任。删除 "receiver",我们不会使用它。
  3. connect()你的工人做你的经纪人。
  4. 每个工人向经纪人发送一条消息,告诉经纪人该工人负责什么。经纪人通过 ID 记录每个工人,以及该工人负责什么工作。
  5. 当代理想要发送特定作业时,它会查找负责该作业的工作人员,然后将作业发送给它。
  6. 如果 worker 立即可用,它会处理它,否则它会保留该作业,直到它准备好处理它。
  7. 当 worker 完成后,它会将作业发回并继续处理新作业(如果有的话)。

所有这些都是 Majordomo 协议所实现的,加上其他必要的元素,如心跳,使 ZMQ 应用程序完全充实。这就是为什么我建议您直接使用该协议,如果它能满足您想要实现的需求,而不是尝试构建您自己的需求。