2012-02-05 11 views
13

RabbitMQは、何らかのメッセージがある場合、または消費者がRabbitMQクライアントをポーリングする必要がある場合に、コンシューマのコールバック関数を呼び出しますか?RabbitMQは、何らかのメッセージがあるときに、コンシューマのコールバック関数を呼び出しますか?

したがって、PHPスクリプトがある場合、RabbitMQはそれを呼び出してメッセージ/パラメータを渡すことができます。例えばShard 1にレーティングが提出され、aggregateRatingテーブルがShard 2にある場合、Shard 2のRabbitMQはaggRating.phpというスクリプトを起動し、shard 1に挿入されたパラメータを渡しますか?

+1

ライブラリの実装方法は異なります。彼らのほとんどはbasic.consumeをサポートしています。あなたのPHPライブラリがない場合は、独自のを書く必要があります。例えば、あなたは、ブローカーからのメッセージを消費するpythonスクリプトまたはjavaプログラムによってPHPスクリプトを動かすことができます。 – scvalex

+0

Python/Javaクライアントはポーリングする必要はありませんが、ブローカへの安定した接続が必要です。ブローカーはメッセージをP/Jクライアントにプッシュします。クライアントは、メッセージごとにスクリプトを呼び出すことができます。詳細は、RabbitMQのチュートリアルを参照してください。http://www.rabbitmq.com/getstarted.html – scvalex

+1

私はPHPに関する経験がなく、PHP AMQPクライアントについては何も知らないです。私がPHPライブラリについて語ったことは、教育を受けた推測にすぎません。私は本当にここであなたの質問に答えていない。今後、RabbitMQ Discussメーリングリストにこのような質問を投稿したいと思うかもしれません。私はSOをチェックする唯一のRabbitMQ開発者だと思う。メーリングリストに掲載されている質問に答えることができます。 – scvalex

答えて

9

basic.consumeは、ブローカがクライアントにメッセージをプッシュできるようにします。つまり、ライブラリの実装方法は異なります。それらのほとんどはbasic.consumeをサポートしていますが、使用するフレームワークに固有の制限があるため、他の多くのクライアントが基づいている公式のRabbitMQ Cクライアントはありません。

PHPライブラリでbasic.consumeがサポートされていない場合は、ポーリング(悪い)を使用するか、より完全なクライアントを使用してスクリプトを実行する必要があります。たとえば、ブローカから消費するPythonまたはJavaプログラムを書くことができます(ブローカの配信をプッシュします)。新しいメッセージを受信するたびにスクリプトを呼び出すことができます。 official tutorialsは、AMQP APIの素晴らしい紹介であり、始めるのに適しています。

これはほとんどの観点から効率的ですが、ブローカへの安定した接続が必要です。

さまざまなクライアントの機能について疑問がある場合、または詳細なガイダンスが必要な場合は、RabbitMQ Discussメーリングリストは質問するのに最適な場所です。開発者はそこに投稿されたクエリに答えるポイントを作っています。

0

Pecl amqpは、AMQPQueue::consumeメソッドで消費機能を使用できるようにします。コールバック関数を渡すだけで、メッセージが到着したときに実行されます。

10

AMQPQueue :: consumeメソッドは、PHP AMQPライブラリ(http://www.php.net/manual/en/amqpqueue.consume.php)のバージョン1.0以降のbasic.consumeの「適切な」実装になりました。 )。残念ながら、PHPは単一のスレッド言語なので、同じプロセス空間でメッセージを待つ間は他のことはできません。 AMQPQueue :: consumeをコールしてコールバックを渡すと、アプリケーション全体がブロックされ、ブローカによって次のメッセージが送信されるのを待っています。その時点で、指定されたコールバック関数が呼び出されます。ノンブロッキングメソッドを使用するには、AMQPQueue :: get(http://www.php.net/manual/en/amqpqueue.get.php)を使用する必要があります。これは、サーバーをポーリングしてメッセージを返します。ブール値。メッセージがない場合はFALSE。

私はscvatexの提案に、この問題に対する「プッシュ」アプローチを使用するために別の言語を使用することに同意していません。 PHPはIO駆動ではないため、メッセージが到着したときに別の言語を使用してPHPスクリプトを呼び出すと、複雑さが増しているように見えます。なぜなら、AMQPQueue :: consumeを使用してプロセスブロック(メッセージ待ち)コールバック内のロジックを使用するか、コールバックを別のPHPスクリプトで実行します。

大規模なジョブ処理システムとしての私の作業では後者を行いました。エラーを分離し、子プロセスで親ジョブプロセッサを実行し続けることができます。これをどのように設定し、いくつかのコードサンプルを詳しく説明したいのであれば、私はそれらを投稿して嬉しいです。

+0

大規模処理システム(Github多分?)に関するあなたの事例を投稿してください。 – JavaSa

関連する問題