1

这是我想要实现的目标 -

REST 服务(部署在多个实例上)获取请求,对其进行处理并将其传递给一组工作实例。

工人完成更大的工作,准备响应并将其发回。

与此同时,主服务完成了与原始请求相关的更多工作,将其与工作人员响应合并,并在请求连接上将其发送回调用方。

如何通过 ZMQ 对此进行建模?

我试过这样做——创建一个 PUSH 套接字并在服务实例中进行“绑定”。- 工作人员“连接”到相应的 PULL 套接字。- 由于同一个服务实例必须获得响应而不是其他服务实例,因此每条消息都发送到 PUSH 套接字,服务会附加一个响应队列名称。- Worker 接收消息,完成工作并在消息中给出的响应队列上推送(进行连接)。- 服务在它的响应队列上进行绑定,当它收到响应时,做剩下的工作并响应服务调用者。

问题 - - 服务实例中的所有线程都必须进行一些同步以获取 PUSH 队列以向工作人员发送请求。- 在负载很重的情况下,这个单一的 PUSH 队列开始阻塞。- 当我在多个实例上部署此服务代码并绑定到同一个套接字时,事情就会中断。

是否有使用 ZMQ 实现此目标的标准方法?我们决定使用 ZMQ 的原因是如果 worker 是另一个 HTTP 服务(重试、断开连接、连接池等)所需的连接管理更少,并且使用 ZMQ 具有更好的吞吐量。

4

1 回答 1

0

好的,这就是我要做的,作为一个高级草图。我确信它还不是很完整,并且需要在各个流程中完成一些帧管理。

在我的愿景中,我们总共有三种类型的流程。第一个是您的带有工作线程的服务器进程,第二个是您的一组工作进程。这与 ZeroMQ 指南中的“工作示例:代理间路由”非常相似。我将引入一个中间消息代理,即第三个进程,将服务器连接到工作人员,这样您就可以添加服务器而无需重新配置客户端,反之亦然。

每个服务器都有一个 ROUTER 套接字来与服务线程通信,由我们称为路由器线程的线程提供服务。

服务线程使用 REQ 套接字与路由器线程对话。当服务线程收到请求时,它通过向 REQ 套接字发送消息来向工作人员发送请求。然后它会做自己的工作。当这项工作完成后,它会尝试从 REQ 套接字中读取,这将阻塞直到收到响应。当它得到响应时,它会合并所有内容并回复其客户端。

路由器线程有一个 ROUTER 套接字来与它的对等方对话,还有一个 DEALER 套接字来与消息代理对话。

现在进入代理流程,这基本上是示例流程。它有两个 ROUTER 套接字,一个与服务进程通信(称为前端),一个与工作进程通信(称为后端)。它轮询前端 ROUTER 上的工作,当它收到一些工作时,它会轮询后端 ROUTER 上的请求,这表明工作进程是空闲的,然后转发请求。

工作进程以一种奇怪的方式使用 REQ 机制。每个都有一个 REQ 套接字,它们用于从代理进程请求工作。他们得到一个包含工作的响应,然后他们完成工作,然后发送另一个包含结果和更多工作请求的 REQ。

关于这一点需要注意的一点是,我们在 Java 中没有任何地方使用锁定或同步——相反,一切都是通过消息传递处理的,使用 ZeroMQ 作为传输。

大纲

于 2015-11-06T16:43:37.580 回答