blog

なぜメッセージキュー・ミドルウェアを使うのか?

システムの結合度が高ければ高いほど、耐障害性は低下します。電子商取引アプリケーションを例にとると、ユーザーが注文を作成した後、カップリングによって在庫システム、物流システム、決済システムが呼び出され、...

Nov 7, 2020 · 3 min. read
シェア

MQを使う理由

メッセージキューは「先入れ先出し」のデータ構造です。

アプリケーションのシナリオには、主に以下の3つの分野が含まれます。

  • アプリケーションのデカップリング

システムの結合度が高ければ高いほど、耐障害性は低くなります。電子商取引アプリケーションを例にとると、ユーザーが注文を作成した後、連動している呼び出し在庫システム、物流システム、決済システム、サブシステムのどれかが故障したり、アップグレードやその他の理由で一時的に利用できなくなったりすると、注文操作に異常が発生し、ユーザーのエクスペリエンスに影響を与えます。

メッセージキューデカップリングを利用することで、システムの結合度を高めることができます。例えば、物流システムに障害が発生した場合、それは修復するために数分かかり、この時間の間に、物流システムで処理されるデータは、メッセージキューにキャッシュされ、ユーザの注文操作は正常に完了します。物流システムが返信すると、補助的な処理は、メッセージキューの注文メッセージすることができますに存在する、端末システムは、物流システムが数分の障害が発生した認識していません。

  • トラフィッククリッピング

システム・リクエスト・トラフィックが瞬時に急増するアプリケーションは、 システムを圧倒する可能性があります。メッセージキューを使用することで、大量のリクエストをキャッシュし、 それらを長い時間にわたって分散させることができます。

一般的に、順序では、システムの安定性を確保するために、システムの負荷がしきい値を超えた場合、それは、ユーザーの経験に影響を与えるユーザーの要求を防ぐことができますし、メッセージキューの使用は、リクエストをキャッシュされる場合は、システムが注文を配置するユーザーを通知する処理を終了するのを待って完了ですので、常に1つの経験をすることはできません良いことです。

経済的配慮のため:

通常の時間帯のビジネスシステムのQPSは、1000の場合、ピーク時のトラフィックは10000であるため、高性能サーバーのトラフィックのピーク構成に対処するために明らかに費用対効果ではありませんが、この時間は、ピーク時のトラフィックのピークシェービングにメッセージキューを使用することができます。

  • データ配信

メッセージキューは、複数のシステムを介してデータを流すことを可能にします。データ生成者は誰がデータを使うかを気にする必要はなく、ただデータをメッセージキューに送り、データ利用者はメッセージキューから直接データを取得します。

MQのメリットとデメリット

メリット:デカップリング、ピークカット、データ配信

デメリットは以下の通り:

  • システムの可用性の低下

    システムの外部依存性が高まれば高まるほど、システムの安定性は低下します。MQがダウンすれば、ビジネスに影響が出ます。

    MQの高可用性を確保するには?

  • システムの複雑化

    MQが追加されたことで、システムの複雑さが大幅に増しました。 以前はシステム間で同期的なリモートコールが行われていましたが、現在はMQを介した非同期的なコールになりました。

    メッセージが繰り返し消費されないようにするには?メッセージロスの状況にどのように対処しますか?メッセージが連続して配信されるようにするには?

  • データの一貫性の問題

    システムBとCが正常に処理し、システムDが処理に失敗した場合、システムAはビジネスを処理し、MQを介してシステムB、C、Dにメッセージデータを送信します。

    メッセージデータ処理の一貫性をどのように確保しますか?

  • 分散トランザクションの問題

    Springを使用している場合は、上記の擬似コードに@Transactionalアノテーションを追加するだけです。しかし、異なるシステムでのトランザクションをどのように保証するのでしょうか?

  • メッセージスタッキングの問題点

各種MQ製品の比較

一般的なMQ製品には、Kafka、ActiveMQ、RabbitMQ、RocketMQなどがあります。

Read next

ブロッキング・キュー

プロデューサー-コンシューマー・モデルを実装する場合、リソースを保存するキャッシュが必要になります。JDKはそのようなキャッシュ、つまりブロッキング・キューを実装しており、マルチスレッド環境でスレッドの安全性を気にすることなく、操作の保存と取得に使用できます。 インターフェースはJava ...

Nov 7, 2020 · 9 min read