ApsaraMQ for RabbitMQ では、コンシューマー スキューとは、キュー内のメッセージがコンシューマーに不均一に分散されるシナリオを指します。これは、コンシューマーのパフォーマンスのボトルネックやリソース使用量の不均衡などの問題を引き起こします。このトピックでは、コンシューマー スキューの考えられる原因と解決策について説明します。
考えられる原因
コンシューマー スキューは、次の原因によって発生する可能性があります。
手動での受信確認の遅延
コンシューマーがメッセージの処理後にメッセージの受信を確認しない場合、ApsaraMQ for RabbitMQ は別のメッセージをコンシューマーに送信します。これは、コンシューマーの負荷を増加させます。たとえば、コンシューマーがメッセージ A を処理しているときに消費がタイムアウトした場合、ApsaraMQ for RabbitMQ ブローカーは、サービス品質( QoS )に基づいてコンシューマーに追加の消費容量があると判断します。この場合、ブローカーはメッセージ B をコンシューマーにプッシュし、コンシューマーの負荷を増加させます。
異なる処理速度
各コンシューマーの処理速度が異なる場合、負荷のほとんどは処理速度の速いコンシューマーに分散されます。
プリフェッチ カウント パラメーターの不適切な設定
プリフェッチ カウント パラメーターに大きな値を指定し、各コンシューマーの処理速度が異なる場合、処理速度の速いコンシューマーはより多くのメッセージを取得できます。これは、コンシューマー負荷の不均衡を引き起こす可能性があります。
キューと接続による不均一なメッセージ配信
キュー間または特定の接続間でのメッセージ配信の不均一により、メッセージが不均一に配信される可能性があります。この問題は、各接続が 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 倍になります。
ネットワーク レイテンシ
不安定なネットワーク伝送または高いレイテンシは、一部のコンシューマーのメッセージ受信速度を低下させる可能性があります。
解決策
ApsaraMQ for RabbitMQ でのコンシューマー スキューの問題を解決するには、次のいずれかの方法を使用します。
プリフェッチ カウント パラメーターの値を変更する
プリフェッチ カウント パラメーターに適切な値を指定して、ブローカーが各コンシューマーに一度に送信するメッセージの数を制限できます。この場合、コンシューマーの消費率も制限される可能性があります。値を指定する場合は注意することをお勧めします。
channel.basicQos(prefetchCount); // プリフェッチ数を設定
コンシューマー コードを最適化する
コンシューマーの処理速度を上げて各メッセージの処理時間を短縮し、各メッセージができるだけ早く受信確認されるようにすることができます。消費期間を指定して消費のタイムアウトを防ぎ、メッセージのプッシュとメッセージの消費が同時に行われるようにすることもできます。
channel.basicAck(deliveryTag, false); // メッセージの受信を確認
コンシューマーを均等に分散する
各コンシューマーの処理能力が同じであることを確認します。
コンシューマー インスタンスの数を増やし、メッセージを並列処理して各コンシューマーの負荷を分散させます。
接続モードを使用し、複数の接続を再利用して、コンシューマーを複数のバックエンド ブローカーに接続します。
問題が解決しない場合は、チケットを送信 してテクニカル サポートを受けてください。