【问题标题】:Router/Dealer proxy not delivering messages路由器/经销商代理不传递消息
【发布时间】:2016-01-23 00:55:00
【问题描述】:

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

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

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

【问题讨论】:

    标签: java zeromq jeromq


    【解决方案1】:

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

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

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

    当您发送第一条消息时,它会被发送到接收者 - 因为它是队列中第一个连接的套接字。当您发送 second 消息时,代理上的 DEALER 套接字正在以循环方式发送到队列中的 next 套接字,这是第一个处理器。基本上,问题在于您的代理无法区分您的“接收器”套接字和“处理器”套接字,它将它们都视为同一事物。

    有几种方法可以解决这个问题。首先,您可能并不真正需要您的“接收器”套接字作为中间人,您可能能够在代理和处理工作人员之间直接来回通信。我建议首先这样做,因为这通常是这些类型的架构的工作方式。

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

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


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

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

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

    但是,在更简单的层面上,您将要做的事情如下:

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

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

    【讨论】:

    • 非常感谢。经过一夜的研究,我还发现了您在这里介绍的内容。这里的问题是,我的工人不一样,所以接收者将消息放在适当的队列中。我现在正在考虑按照您的建议将代理后端套接字更改为路由器,但我不确定该怎么做,前端和后端之间的代理代理还是我应该在那里有一个轮询器?
    • @Stugal 有道理。我已经更新了答案以涵盖您所描述的内容。
    猜你喜欢
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-08
    • 1970-01-01
    • 1970-01-01
    • 2017-08-28
    • 1970-01-01
    相关资源
    最近更新 更多