ZMQ - 具有多个前端服务实例和后端工作程序的请求/响应

时间:2015-11-03 08:26:12

标签: java multithreading sockets zeromq jzmq

这是我想要实现的目标 -

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

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

同时主服务完成了一些与原始请求相关的工作,将其与工作者响应合并,并在请求连接上将其发送回调用者。

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

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

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

ZMQ是否有实现这一目标的标准方法?我们决定使用ZMQ的原因是,如果worker是另一个HTTP服务(重试,断开连接,连接池等)以及使用ZMQ获得更好的吞吐量,则需要更少的连接管理。

1 个答案:

答案 0 :(得分:0)

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

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

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

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

路由器线程具有与其对等端通信的ROUTER套接字,以及与消息代理进行通信的DEALER套接字。

现在进入经纪人流程,基本上是the example process。它有两个ROUTER套接字,一个用于与服务进程通信(称之为前端),另一个用于与工作进程通信(称之为后端)。它轮询前端ROUTER上的工作,当它接收到一些时,它会轮询后端ROUTER上的请求,这表示工作进程是空闲的,然后转发请求。

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

有一点需要注意的是,我们在Java中没有使用锁定或同步 - 而是通过消息传递处理所有内容,使用ZeroMQ作为传输。

Outline