すべてのプロダクト
Search
ドキュメントセンター

ApsaraMQ for RabbitMQ:コンシューマー負荷の不均衡の考えられる原因と解決策は何ですか

最終更新日:Jan 14, 2025

ApsaraMQ for RabbitMQ では、コンシューマー スキューとは、キュー内のメッセージがコンシューマーに不均一に分散されるシナリオを指します。これは、コンシューマーのパフォーマンスのボトルネックやリソース使用量の不均衡などの問題を引き起こします。このトピックでは、コンシューマー スキューの考えられる原因と解決策について説明します。

考えられる原因

コンシューマー スキューは、次の原因によって発生する可能性があります。

  1. 手動での受信確認の遅延

    コンシューマーがメッセージの処理後にメッセージの受信を確認しない場合、ApsaraMQ for RabbitMQ は別のメッセージをコンシューマーに送信します。これは、コンシューマーの負荷を増加させます。たとえば、コンシューマーがメッセージ A を処理しているときに消費がタイムアウトした場合、ApsaraMQ for RabbitMQ ブローカーは、サービス品質( QoS )に基づいてコンシューマーに追加の消費容量があると判断します。この場合、ブローカーはメッセージ B をコンシューマーにプッシュし、コンシューマーの負荷を増加させます。

  2. 異なる処理速度

    各コンシューマーの処理速度が異なる場合、負荷のほとんどは処理速度の速いコンシューマーに分散されます。

  3. プリフェッチ カウント パラメーターの不適切な設定

    プリフェッチ カウント パラメーターに大きな値を指定し、各コンシューマーの処理速度が異なる場合、処理速度の速いコンシューマーはより多くのメッセージを取得できます。これは、コンシューマー負荷の不均衡を引き起こす可能性があります。

  4. キューと接続による不均一なメッセージ配信

    キュー間または特定の接続間でのメッセージ配信の不均一により、メッセージが不均一に配信される可能性があります。この問題は、各接続が 1 つの ApsaraMQ for RabbitMQ ブローカーにのみ接続できるチャネル モードで頻繁に発生します。ApsaraMQ for RabbitMQ は、高可用性分散アーキテクチャを使用します。コンシューマーの数がバックエンド ブローカーの数で割り切れない場合、1 つのコンシューマーがバックエンド ブローカー全体からメッセージをプルできる可能性があります。コンシューマーの消費能力が高い場合、コンシューマーの負荷が高くなる可能性があります。

    たとえば、1 ~ 7 の番号で識別される 7 つのコンシューマーが、A、B、C、D という名前の 4 つのバックエンド ブローカーへの 7 つの接続を確立します。コンシューマー 1 とコンシューマー 5 はブローカー A に接続され、コンシューマー 2 とコンシューマー 6 はブローカー B に接続され、コンシューマー 3 とコンシューマー 7 はブローカー C に接続され、コンシューマー 4 はブローカー D に接続されます。この場合、ブローカー D によってプルされたメッセージは、コンシューマー 4 にのみプッシュできます。各ブローカーが同じ数のメッセージをプルできる場合、コンシューマー 4 の負荷は他のコンシューマーの負荷の 2 倍になります。

  5. ネットワーク レイテンシ

不安定なネットワーク伝送または高いレイテンシは、一部のコンシューマーのメッセージ受信速度を低下させる可能性があります。

解決策

ApsaraMQ for RabbitMQ でのコンシューマー スキューの問題を解決するには、次のいずれかの方法を使用します。

  1. プリフェッチ カウント パラメーターの値を変更する

    プリフェッチ カウント パラメーターに適切な値を指定して、ブローカーが各コンシューマーに一度に送信するメッセージの数を制限できます。この場合、コンシューマーの消費率も制限される可能性があります。値を指定する場合は注意することをお勧めします。

    channel.basicQos(prefetchCount); // プリフェッチ数を設定
  2. コンシューマー コードを最適化する

    コンシューマーの処理速度を上げて各メッセージの処理時間を短縮し、各メッセージができるだけ早く受信確認されるようにすることができます。消費期間を指定して消費のタイムアウトを防ぎ、メッセージのプッシュとメッセージの消費が同時に行われるようにすることもできます。

    channel.basicAck(deliveryTag, false); // メッセージの受信を確認
  3. コンシューマーを均等に分散する

    • 各コンシューマーの処理能力が同じであることを確認します。

    • コンシューマー インスタンスの数を増やし、メッセージを並列処理して各コンシューマーの負荷を分散させます。

    • 接続モードを使用し、複数の接続を再利用して、コンシューマーを複数のバックエンド ブローカーに接続します。

問題が解決しない場合は、チケットを送信 してテクニカル サポートを受けてください。