我正在处理分布式应用程序。网络基于ZMQ(jeromq),这是我的架构:
N Clients (Dealer socket) <---> (Router) Proxy (Dealer) <---> 1 (Dealer) Reciving Worker
<---> N (Dealer) Processing Workers
当客户端发送消息时,接收工作者接收到消息,放置在队列中,处理工作人员将其接收并进行一些处理并将其发送回去,客户端会收到响应,然后发送另一个请求,接收工作者没有收到请求,但它是由客户发送的。基本上只有第一轮&#39;作品。我在这里缺少什么?!
答案 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中进行了讨论)。它完全符合您的要求,并且做得很好。
但是,在更简单的层面上,您将要做的是以下内容:
ROUTER
个套接字 - 这两个套接字都是bind()
- ed。connect()
你的工人做你的经纪人。所有这些都是Majordomo协议实现的,完成其他必要的元素,如心跳,使得完全充实的ZMQ应用程序。这就是为什么我建议您直接使用该协议,如果它满足您正在尝试完成的需求,而不是尝试构建自己的协议。