2017-04-13 12 views
1

私はreactphp/zmqを使用しています。ZeroMQ + ReactPHP:複数の生産者(プッシュ)と複数の消費者(プル)

複数のプルワーカーに複数のプッシュワーカーを配置するにはどうすれば可能ですか?私はconnectとしての両方を設定しようとすると

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

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

またはシングルプルとマルチプッシュ:

Aのみマルチプルとシングルプッシュ、READMEの例のように持つことができますプルはメッセージを受け取りません。

そうでなければ、それはスロー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

提案されたアーキテクチャで何を解決していますか?なぜあなたは複数のプッシャーを持つ必要がありますか?あなたは複数のプッシャーを持つことはできません。すべてのワーカーがプッシュしている単一のエンドポイントと、すべてのワーカーがプルする単一のエンドポイントが必要です。幸運にも、ZeroMQはこれを簡単にする 'TIPC'プロトコルをサポートしていますが、正確にあなたがしようとしているものを説明して、最適なアーキテクチャを提案できるのは賢明でしょう。 – Mjh

+0

私は、新しいリストが追加されたときに、複数のプルーアがそれらを検証するためにそのキューをリッスンしている間、電子メールをキューに追加する新しいプッシャを起動する電子メール検証ツールを構築しています。 –

+0

あなたはファンアウト(プッシャー、**は**仕事を与えているもの)を持っていて、あなたは仕事をしている人、**仕事をしている人**を持っています。 **あなたはキューを持っていません**。 ZeroMQはキューではなくトランスポート層です(キューを内部的に使用します)。あなたが必要とするのは、待ち行列の役割を果たす真ん中のサービスです。それはタスクを受け取り、送信します。あなたのプッシャーはキューにプッシュし、プルーファーはキューからプルします。そのサービスは、タスクを受け取るために「プル」を使用し、それを労働者に渡すために「プッシュ」する。 'push'を使ってタスクを与え、' pull'を実行してタスクを実行します。 – Mjh

答えて

0

なるほど!物事を明確にするために非常に@Mjhありがとうございます。

私は、メッセージキューブローカでなければならないものが必要であり、ZMQには何かが必要なことが分かります。内部的にはzmq_proxyと呼んでrrbrokerループを開始しますが、残念ながら、これらの人はreactphp/zmqで抽象化されませんが、ext-phpでZMQDeviceになります。

ソース: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、複数のエンドポイントから受信するミドルウェアですが、これらのエンドポイントは一意のアドレスにバインドする必要があります。プッシュし、それぞれが単一のポートにプルします。私は1つのポートにすべての必要なプッシャーとすべての必要なプーラーを1つのポートに '接続 'したい。 –

+0

ZMQPollが問題を解決しました。すべての必要なプッシャーを5555ポートに接続し、必要なすべてのプーラーに5556を接続します。 他のソリューションが必要な場合は、プロキシhttps://bitbucket.org/snippets/gollariel/8Axx4をご覧ください –

関連する問題