2017-04-13 264 views
1

我使用reactphp/zmqZeroMQ + ReactPHP:多个生产者(推)和多个消费者(拉)

如何在多个拉动员工中拥有多个推动员工,这可能吗?

一个只能有多重拉动和单推,如自述的例子:

$push->connect() 
$pull->bind() 

或单拉和多推:

$push->bind() 
$pull->connect() 

当我尝试设置都为connect的拉不接收消息

否则,试图与bind它抛出启动多个进程:

ZMQSocketException: Failed to bind the ZMQ: Address in use 

我应该有一个中间件?

(5555)      (5556) 
push -| (5555) > (5556) |- pull 
push -|-> pull & push <- |- pull 
push -| bind/bind |- pull 
connect     connect 
+0

你在用那个建议的架构解决什么问题?为什么你需要有多个按钮?你不能有多个推进器,然后有随机数量的工人拉。您需要有一个单一的端点,其中所有工作人员PUSH和一个终端,其中所有工作人员都从中取出。幸运的是,ZeroMQ支持'TIPC'协议,这使得这个过程变得简单,但是你可以更明智地解释一下你正在尝试做什么,这样我们就可以建议最佳的体系结构。 – Mjh

+0

我正在构建一个电子邮件验证工具,当添加一个新列表时,它会启动一个新推送器,将其电子邮件添加到队列中,同时多个提取器将监听该队列以验证它们。 –

+0

你有粉丝(推动者,**给**的任务),你有工作者,**执行任务的人。你**没有队列**。 ZeroMQ是传输层,不是队列(尽管内部使用队列)。你需要的是一个中间的服务,作为一个队列 - 它接收和发送任务。你的推动者推动排队,你的推拉从队列中拉出。该服务将使用“拉”来接收任务,并使用“推”将其交给工人。你使用'push'来给它任务,'pull'从中获取任务。 – Mjh

回答

0

啊哈!非常感谢@Mjh澄清事情。

原来,我确实需要一些应该是消息队列代理的东西,而ZMQ确实有一些东西。内部调用zmq_proxy启动了一个rrbroker循环,不幸的是,这些人不是在reactphp/zmq中抽象出来的,但是他们通过ZMQDevice处于ext-php中。

来源:http://zguide.zeromq.org/php:chapter2#ZeroMQ-s-Built-In-Proxy-Function

0
(5555)      (5556) 
push -| (5555) > (5556) |- pull 
push -|-> pull & push <- |- pull 
push -| bind/bind |- pull 
connect     connect 

这是非常相似的ZMQPoll想法。不好,你不需要使用reactphp/zmq

你可以用ZMQPoll运行进程。该进程可以绑定在5555和5556上。其他进程可以推送和拉取消息。

my example how it can be work

more examples on official ZMQ site

PHP example poller from official site

UPD:如果你想其他的解决办法,look at ZMQProxy

+0

非常感谢,但我认为民意调查解决了相反的问题。 我需要的东西是:N-1-N和Poll确实:1-N-1,它是从多个端点接收的中间件,但是这些端点应该绑定到一个唯一的地址,然后我需要“绑定”每个推,每个拉到一个端口。我想“连接”一个端口中所有需要的推动器,以及一个端口中所有需要的推动器。 –

+0

ZMQPoll解决了您的问题。您连接到5555端口所有需要的推动器,并且您连接到5556所有需要的推动器。 但是如果你想要其他解决方案,请看代理https://bitbucket.org/snippets/gollariel/8Axx4 –

相关问题