2011-09-13 9 views
1

私はRabbitMQの具体的な使用例を念頭に置いています。特定のことを明確にし、推奨事項を尋ねます。RabbitMQ(およびnode.js)の非同期確認

1-私は2つのタスクが実行されるメッセージは、パブリッシュ:

このシナリオを考えmessageAとし、その後messageB

2 - 私の消費者は、messageAを取得し、このメッセージに含まれているタスクを実行しますが、タスクが実行されている間にサーバーがクラッシュする

質問:サーバーが再起動されると、メッセージAはキューに入れられ、メッセージB(クラッシュ前と同じ順序)より前にキューに入れられますか?

私の理解しているところでは、消費者がメッセージの受信時にデフォルトでそれを確認したため、サーバーがクラッシュした場合、messageAは失われます。

私の考えは、別々にメッセージを消費して確認することです。最初にタスクを実行し、タスクが正常に実行されたときにメッセージを確認します。

この方法に問題はありますか?あなたは私に他の何かをするようアドバイスしますか?

答えて

0

no-ackモードで消費されるメッセージ(http://www.rabbitmq.com/amqp-0-9-1-reference.html#domain.no-ackを参照)は、サーバーが配信されたときにそのようなメッセージについて完全に忘れてしまったため、サーバーがクラッシュした後に再キューされません。そのメッセージは配送後に消費者が責任を負います。

タスクを正常に完了した後でのみメッセージを確認することは、シナリオで正しい方法です。メッセージがブローカクラッシュに耐えられるようにするには、キューが耐久性があり、メッセージが永続的に公開されていること(配信モード2)、パブリッシャ確認またはトランザクションを使用してメッセージがディスクに書き込まれることを確認する必要があります。

messageAの処理中にブローカーがクラッシュした場合、メッセージの順序は保持されます。ブローカーではなく消費者がクラッシュした場合、メッセージの順序は逆になります。

1

のRabbitMQは、再キューイングのためのメッセージの順序を保持しません:

ほとんどの部分については、はい。出版社がメッセージM1、M2、M3 とM4(その順序で)を同じチャンネルに送り、同一のルーティング 情報を公開しているとします。これらのメッセージがキューにルーティングされる場合、 は公開されたのと同じ順序で終了します。 キューで消費すると、M1、M2、M3、そしてM4が生成されます。

ただし、注文は再注文がない場合にのみ保証されます。メッセージが受信される前にコンシューマがチャネル を閉じた場合、メッセージは暗黙的に再キューに入れられます。 例えば、消費者がM1を受け取った場合、 はackに失敗し、チャネルを閉じ、次の消費者はM2、M3、M4、M1の順番でメッセージを受信する。 消費者がbasic.recover {requeue = true}を呼び出す場合、メッセージは 明示的に再キューに入れることもできます。 少なくとも1回以上の配送についてのよくある質問は、これについてもう少し詳しくお話します 詳細。

RabbitMQ FAQ

これは行うことができますが、RabbitMQのは、あなたが親メッセージの子どもたちのメッセージをラップすることにより、ライフサイクルを自分で管理する必要が自動的にそれをしていません。親メッセージを管理し、メッセージ1が成功してもメッセージ2が失敗するとロールバックを処理するコードを作成します。うまくいけば助けてくれます。

お待ちしています

関連する問題