1

私のプロジェクトでは、さまざまな方法でSQLクエリをRabbitキューにプッシュする(基本的には、メッセージをすべてのキューにブロードキャストする交換)などの要件があります。キューにプッシュされたこれらの SQL クエリは、現時点では (基本的にはレポート目的で) 本番環境と比較するとあまり重要ではないため、サーバーに多くの負荷がかからないときに、これらのクエリを別の環境 (他のスタンドアロン プロジェクト) で実行します。 .

では、ストーリーの第 2 部に入りましょう。反対側のスタンドアロン アプリケーションには、RabbitMQ (交換) からのメッセージ (SQL クエリ) を消費する 2 つのコンシューマーがあります。1 つのコンシューマーは常にログを記録し (クエリのバックアップなど)、他のコンシューマーは DB でバッチ更新/挿入を実行します。

私の問題は、いくつかの理由でいくつかのクエリが失敗する可能性があり、バッチ操作であるため、バッチ全体がロールバックされ、それらが既に消費されているためキューから再度取得できない場合に、このユースケースを達成するための良い方法です。2 番目のコンシューマによって作成されたバックアップから取得する必要があることはわかっていますが、例外が発生した後に最初のコンシューマを停止する必要があり、その特定の失敗したクエリをバックアップ ログからフェッチする良い方法は何ですか (クエリの不足を考慮して、考えています)複数のログ ファイルにローリング アペンダー ログを使用する方法)。私の問題を辛抱強く理解してくれてありがとう。この問題を解決する良い方法を提案してください。

4

1 に答える 1

0

消費者側で発生する可能性のある障害を分類してみてください。あるかもしれません

  • 永続的なエラー (無効な SQL ステートメントなど) および
  • 一時的なエラー (ネットワークの不具合、データベース サーバーの停止/再起動など) など

一時的なエラーの場合は、メッセージの処理を再試行してください (Spring の再試行ライブラリを参照してください)。永続的なエラーになるメッセージはinvalid letter queue、さらなる分析/レポートのために送信される場合があります (再ルーティングする前に、例外をヘッダーとしてメッセージに追加します)。

于 2015-02-02T21:03:16.943 に答える