2017-11-28 3 views
0

たとえば、Googleの情報の一部をサードパーティのAPIに渡したいとします。このAPIがダウンするとネットワークのエラーが発生することはありません。そこで、我々は2つの選択肢があります。要求のデッドレターのメカニズムを使用するには、RabbitMqを介してすべてのサードパーティのAPI呼び出しをルーティングすることは理にかなっていますか?

  1. ログインの失敗は、このAPIに押され、いくつかのスケジュールの仕事を介してそれらをプッシュしようとしている - 問題は、これらの要求の一部が原因ダウンしているAPIに失敗した場合、我々は必要なものですこれらの失敗したリクエストも再発行してください。これがオンになります。
  2. Rabbitmqのデッドレターメカニズムのようなものを使用してください。失敗したリクエストに対して再試行の仕組みを使用できますが、メンテナンスが増え、複数のデッドレターの再試行があっても失敗した場合はどうなりますか?

このような第3のAPIプロセスをどのように処理し、失敗したリクエストを再度プッシュする必要がありますか?

+0

あなたの2つのオプションは相互に排他的ではなく、オプション2は実際に意味をなさない。うまくいけば、私の答えは混乱をなくしてくれるはずです。 – theMayer

答えて

1

したがって、RabbitMQ dead-letteringは、negative acknowledgementと同じではありませんが、関連付けることはできます。

あなたは(私はそれはあなたの説明は非常に抽象的であるcorrectly-理解していることを仮定して)記述されているシナリオは、かなり一般的な状況で、次の一連のイベントによって説明することができます。

  1. プロセッサからのメッセージを受け取りキュー
  2. プロセッサがメッセージを処理しようとしました
  3. プロセッサがメッセージ処理に失敗しました

質問は手順4で行うことです。多くのアプリケーションでは、手順4でメッセージを削除します。しかし、RabbitMQでは、この状況で否定応答を使用することができます。これは、メッセージを処理できなかったことをブローカに通知します。ブローカは、メッセージをキューの先頭に戻すことができます。同じプロセッサがメッセージを再度受け取って処理しないようにすることはできません。したがって、エラー状態が一時的な場合(つまりメッセージ自体ではなくプロセッサの問題)に使用する必要があります。

アプリケーションの処理ロジックは、メッセージをキューから取り出して処理しようとするときに決定する必要があります。たとえば、あらかじめ決められた時間待機することは理にかなっているかもしれません。また、サードパーティのAPIをポーリングしてバックアップが取れるまで賢明かもしれません。ここであなたがするのはあなた次第です。

デッドレタリング

メッセージ(basic.nackを)拒否したときに今、あなたはrequeue=falseを指定することにより、RabbitMQのデッド文字かどうかのメッセージを制御することができます。 requeueがfalseの場合、メッセージはデッドレターになります(デッドレターエクスチェンジが設定されていない場合はドロップされます)。

デッドレターのキューはまさにそれです。メッセージが消える場所です。基本的に、通常のプロセッサーをこのキューに接続するのは理にかなってはなりません。なぜなら、定義上、最初にメッセージが処理された理由は処理できないからです。そのため、条件を一時的にする(つまりサーバーがダウンする)場合は、メッセージを再キューし、条件が解決されるまでさらにメッセージの処理を停止します。一方、メッセージに問題がある場合は、すべての手段でデッドレターにしてください。

+0

だから、rabbitmqの再キューングメカニズムを使うべきだと提案します。しかし、私たちが多くのサードパーティ製のAPIを使用しているためオーバーヘッドではなく、これらのAPI呼び出しのために別のコンシューマーを作成する必要があります。 – maverick

+0

プロセッサがメッセージをどのように処理するか、全体的なシステムの動作に影響を与えます。考えられるのは、処理能力に問題がある場合、メッセージの消費を停止し、処理できなかったメッセージを再キューすることです。プロセッサーに問題がある場合は、処理を続行することは理にかなっていません。 – theMayer

+0

私はここにいくつかの混乱があると思う私の質問は、我々が再試行またはプロセスを消費停止するかどうかではないが、私たちのサーバから直接サードパーティのAPIを打ち負かすか、エラーをどこかに記録するか、このrequeueプロセスを使うためにrabbitmq – maverick

関連する問題