マイクロサービス-キューを使用してサービスの失敗を補正する


8

アプリでは、ある種のマイクロサービスアプローチを使用しています(ただし、実際にはそれに準拠していません)。

サービスがダウンしているか例外がスローされている場合、アプローチはそれをキュー(ActiveMQ)に入れ、サービスが再びアップしたときに再試行します。

これは「標準」ソリューションですか?それとも、何らかの理由で回避する必要がありますか?

または、この問題に対するより良い、または代替の解決策はありますか?


現在のソリューションの問題は何ですか?最良/より良いソリューションは、要件に完全に適合するものです。現在のものですか?
Laivは2016年

@Laiv:それ自体には問題はありませんが、私はそのアーキテクチャでの経験があまりないので、このアプローチに考慮すべき潜在的な問題や制限があるかどうかを尋ねていました。
user140547

キューがダウンした場合はどうなりますか?
Jon Raynor 2016年

@JonRaynor:あきらめてエラーを返す。おそらく2番目のフォールバックメカニズムを実装するのはやり過ぎです...
user140547

回答:


3

呼び出しを非同期にできると仮定すると(続行するためにサービスから応答を取得する必要がない)、そうすることは多くの場合良い考えです。

これにより、呼び出し側のサービスは、他のサービスの呼び出しによって引き起こされる遅延(または完全なエラー)なしに作業を続行できます。これにより、より複雑な再試行ロジックを使用して、時間の経過とともに負荷をより均等に分散させることができます。

多くの場合、キューによって提供される順序付けの保証をあきらめ、Kafkaまたは別の非同期メッセージブローカーに切り替えることで、さらに多くのことを得ることができます。HermesはKafkaの上にさらに便利なREST APIを提供します。


私はクライアントについて話しているというコンテキストであると仮定して、この回答を賛成します。これは実際にはマイクロサービスの質問ではありません。これはクライアントの設計決定です。サービスが同期であるかどうかであり、稼働しているか、そうでないか。質問では明確に明記されていませんが、クライアントについて話している場合にのみ意味があります。
JimmyJames 2016年

3

これは私の考えでは悪いアプローチです。あなたはどちらか

  • 常に通信してキューを表示する:アプリケーションは即時の応答を期待すべきではないため、ワーカープロセスが100%利用可能である必要はありません。

  • 常にRPCスタイルの通信を使用します。複数のサービスインスタンス間でリクエストを負荷分散します。サービスに障害がある場合、別のサービスがリクエストに応答するため、100%の稼働時間が得られます。

フロー、サービスの呼び出し、エラーの発生、キューへの配置、すべてのメッセージではなく一部のメッセージへの返信がないかキューを確認することを忘れないでください。複雑すぎる。

編集:どちらか一方だけではなく、同期と非同期の両方の通信スタイルをプログラムする必要があるという点で、非常に複雑です。


私はこれにある程度同意します。それは、より複雑。複雑すぎるかどうかは、より大きなアーキテクチャを理解せずに評価することは困難です。100%キューベースにすることの問題は、新しい単一障害点が追加され、他のいくつかの課題が生じることです。あなたのプロセスがタスクを圧倒なっている場合たとえば、キューへの書き込みは、一般的には本当に速いのでれるまで、入力側に明らかな問題はありませんですブームキューがいっぱいになります。リクエストのソースを調整できない場合、大きな問題が発生する可能性があります。乗り越えられないわけではありませんが、それはそれ自身の複雑さを追加します。
JimmyJames 2016年

できれば、最後の文を書き直すことをお勧めします。ここで「覚えていること」は実際には問題ではありません。キューから読み取るようにコードを書き込んだら、覚えておく必要はありません。これは単に作成して維持するための追加のコードですが、常にキューから読み取る場合とほとんど変わらないはずです。
JimmyJames 2016年

唯一のエラーでは、キューシナリオに移動し、返信が必要な場合は、キューチェックと即時応答処理の両方を記述する必要があります。あなたはそれらの誤ったコールやない即時のもの「覚えて」する必要がありますので
ユアン・

@jimmyあなたはどんな解決策でもそれらの問題を得る。常にキューに入れる、時々またはすべてのRPCをキューに入れる。
Ewan

プロデューサーがコンシューマーを待っているときには、これらの問題のいくつかは実際にはありません。たとえば、1秒あたり最大1000件のリクエストを受信し、プロセスの内部容量が1秒あたり100に低下した場合、プロデューサーは簡単な方法でブロックされます。それらも制限されます。中央にキューを挿入するだけの場合、プロデューサーは通常、容量の低下の影響を受けず、最大レートで続行します。あなたはそれの容量制限をヒットするまで、キューは、いっぱいになると、書き込みは(1000の失敗秒で。)失敗を開始
JimmyJames
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.