2017-10-26 3 views
0

私は、メッセージがコンシューマ(「ワーカー」)によって順番に処理されるようにするキューイングメカニズムを使用する必要があります。投稿後の注文保証付きメッセージキューイング

私は過去にRabbitMQを使用しており、メッセージを受信した順序を保証しています。しかし、もしその順序が正しいのではないでしょうか?

私はメッセージ[4,5,3,2,1]を提出したとしましょう、RabbitMQの消費者はその順序でメッセージを処理します。メッセージが互いに依存しているので[1、2、3、4、5]の順番で処理したい場合はどうすればよいですか?

また、メッセージ2が確認される(ギャップがない)前に、消費者がメッセージ3を消費することを許可したくありません。

このユースケースをサポートするキューイングソリューションはありますか?現時点では、メッセージをデータベースにダンプし、作業者に定期的にデータをプルさせる。

答えて

1

「メッセージシーケンス」または「リスケンサー」の2つのパターンのいずれかを検討してください。次のように

Message Sequenceが有用である:

大量のデータセットは、メッセージサイズのチャンクに分割される必要があるメッセージのシーケンスとしてデータを送信し、シーケンス識別フィールドと、各メッセージにマークを付けることができるたび。

Resequencerは少し異なっている:彼らは指定された順序で出力チャンネルに公開できるように

が収集するために、ステートフルフィルタ、置換器を使用し、再オーダーメッセージ。

Resequencerは、到着しなかったメッセージのストリームを受信できます。 Resequencerは、完全なシーケンスが得られるまで、シーケンス外のメッセージを格納するための内部バッファーを含んでいます。シーケンス内のメッセージは出力チャネルにパブリッシュされます。メッセージが次のコンポーネントで順番に到着することが保証されるように、出力チャネルはオーダー保存されていることが重要です。ほとんどの他のルータと同様に、Resequencerは通常、メッセージの内容を変更しません。

私は非常には(Martin Fowler氏らの同類からの貢献と。)はGregor Hohpe /ボビー・ウルフによって本にこれらのパターンを読ん「エンタープライズ統合パターン」を示唆している

詳細があります本質的にメッセージシーケンスは、シーケンス識別子、位置、および「終了」(ブールフィールド)を有することに依存する。シーケンスを処理するには、キューの最後にアダプタが必要です。

シーケンサは、「完全なシーケンスが取得されるまで、順序どおりのメッセージを内部バッファに格納した後、メッセージを適切なシーケンスで出力チャネルにパブリッシュする」(282ページ) 。

これは、あなたが現在使用している "dump to db、then worker a pull"戦略によく似ています。

これらのパターンの実装の詳細は、アプリケーション言語とキュー(あなたの場合はRabbitMQ)の選択に基づいていますが、パターンはすでにかなり確立されているので、それらをよく見ていきます。

私はRabbitMQ自体に組み込まれているメカニズムを理解できません。

これが役に立ちます。

編集

私は "のRabbitMQリシーケンサ" をGoogleで検索して(ただし有効性を保証することはできません)、次を発見した:rabbus-sequence (GitHub)

いずれの場合でも、自分のコードがインスピレーションを得ることができるかどうかを確認するのに役立ちます。

関連する問題