2015-11-03 30 views
1

这是我想实现 -ZMQ - 请求/响应与多个前服务实例和后端工人

REST服务(部署在多个实例)接到请求,处理它,并把它送到一个工人实例队伍。

工作人员完成更大的工作,准备好回复并将其发回。

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

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

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

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

是否有一个标准的方法来实现这与ZMQ?我们决定使用ZMQ的原因是,如果员工是另一个HTTP服务(重试,断开连接,连接池等),并且ZMQ具有更高的吞吐量,则需要的连接管理更少。

+0

我发现[此](https://books.google.de/books?id=TxHgtl_sFmgC&lpg=PP1&dq=zeromq%20messaging%20for%20many&pg=PA114#v=onepage&q=zeromq%20messaging% 20for%20many&f = false)以及另一种带流光设备的解决方案。但是这两种方法都涉及一个在中间运行的代理实例,并成为单点故障。有没有这个限制的版本? – anindyaju99

+0

我会尝试写一些涉及ROUTER和DEALER等的东西,但有两件事情会跳出来。您是否阅读过http://zguide.zeromq.org/,并且服务实例中的线程应该通过ZMQ套接字进行通信,而不是通过同步进行通信。 – dsolimano

+0

@dsolimano不能说我记得我在那篇指南中读到的所有内容,但是我肯定会经历这些。在我的情况下跨线程通信不是问题。 – anindyaju99

回答

0

好的,这是我会做的,作为一个高层次的草图。我相信它不完整,并且需要在各种流程中完成一些框架管理。

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

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

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

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

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

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

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

Outline

+0

谢谢。我不是很确定我完全理解了描述。是否可以添加图表?这将是很大的帮助:-)另外,这些路由器和代理商是在单独的进程中运行还是作为我的服务器/客户端进程的一部分运行?可能从图中也会更清楚。 TIA。 – anindyaju99

+0

让我看看我能鞭打什么。 ROUTER和DEALER只是插座类型。 – dsolimano

+0

添加了一个基本图 – dsolimano