有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

以下是我正在努力实现的目标-

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

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

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

如何通过ZMQ对此进行建模

我试过这样做- -创建推送socket并在服务实例中执行“绑定”。 -工人“连接”到相应的插座。 -由于同一个服务实例必须获得响应,而没有其他服务实例,因此在将每条消息发送到推送socket时,服务会附加一个响应队列名称。 -工作者接收消息,进行工作,并在消息中给出的响应队列上推送(进行连接)。 -服务在其响应队列上执行绑定,当它收到响应时,执行其余工作并响应服务调用方

问题- -服务实例中的所有线程都必须进行一些同步,以获得推送队列,从而向工作者发送请求。 -当负载较重时,这个单推队列开始阻塞。 -当我在多个实例上部署此服务代码并绑定到同一个socket时,情况就不一样了

有没有一种标准的方法可以通过ZMQ实现这一点?我们决定使用ZMQ的原因是,如果worker是另一个HTTP服务(重试、断开连接、连接池等),那么需要较少的连接管理,并且使用ZMQ可以获得更好的吞吐量


共 (1) 个答案

  1. # 1 楼答案

    好的,这是我要做的,作为一个高水平的草图。我相信它还不完全,在不同的过程中需要进行一些框架管理

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

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

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

    路由器线程有一个路由器套接字与它的对等方通信,还有一个交易商套接字与消息代理通信

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

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

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

    Outline