2017-04-13 534 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 –

相關問題