Amazon SQS フェアキュー - Amazon Simple Queue Service

Amazon SQS フェアキュー

Amazon SQS フェアキューは、顧客、クライアントアプリケーション、メッセージタイプなど、複数の論理エンティティからのメッセージを含むマルチテナントキューにおいて、ノイジーネイバーの影響を自動的に軽減します。これらの共有キュー環境において、重要なパフォーマンス指標のひとつがドウェル時間です。ドウェル時間は、メッセージがキューに到着してから処理されるまでに費やす合計時間を測定します。あるテナントがシステムが処理できる量を超えてメッセージを発行してキューにバックログを作成した場合でも、フェアキューは他のテナントのドウェル時間への影響を最小限に抑えます。

定常状態

次の図は、4 つの異なるテナント (図中の ABCD) からのメッセージを含むマルチテナントキューを示しています。キューは定常状態で動作し、コンシューマーがキューに表示されるとすぐにメッセージを受信するため、メッセージバックログがありません。すべてのテナントのドウェル時間が短くなります。この定常状態では、すべてのコンシューマー容量が完全には活用されていません。

4 つの異なるテナントからのメッセージを含むマルチテナントキュー (A、B、C、D で表示)。キューは定常状態にあり、処理中のメッセージはテナント間で均等に分散され、すべてのテナントにバックログがなく、ドウェル時間が短くなります。

ノイジーネイバーの影響

マルチテナントキュー内の 1 つのテナントがバックログを作成し、他のすべてのテナントのメッセージのドウェル時間が長くなると、ノイジーネイバーの影響が発生します。テナントは、他のテナントより多くのメッセージを送信した場合や、そのテナントのメッセージをコンシューマーが処理するのに時間がかかる場合に、ノイジーネイバーとなることがあります。

この図は、テナント A からのトラフィックの増加により、キューにバックログがどのように作成されるかについて示しています。コンシューマーはテナント A からのメッセージの処理に追われている間、他のテナントのメッセージはバックログで待機することになり、すべてのテナントのドウェル時間が長くなります。

テナント A がトラフィックを増加し、キューにバックログを作成する場合の結果。テナント A のメッセージは処理中の状態で過剰に占められ、他のテナントのメッセージがバックログに滞留することで、ドウェル時間が長くなります。

フェアキューによる軽減

Amazon SQS は、処理中にテナント間のメッセージ分散 (「処理中」の状態) をモニタリングすることで、ノイジーネイバーを検出します。あるテナントが他のテナントに比べて処理中のメッセージ数が不釣り合いに多い場合、Amazon SQS はそのテナントをノイジーネイバーとして識別し、他のテナントのメッセージ配信を優先します。このアプローチにより、他のテナントへのドウェル時間の影響が軽減されます。

この図は、Amazon SQS フェアキューがノイジーネイバー問題にどのように対処するかを示しています。あるテナント (テナント A) がノイジーな場合、Amazon SQS は他のテナント (BCD) からのメッセージを返すことを優先します。この優先順位付けにより、クワイエットテナントのテナント BCD のドウェル時間が短くなります。一方、テナント A のメッセージのドウェル時間は、他のテナントに影響を与ることなく、キューバックログが消費されるまで延長されます。

処理中の状態をモニタリングすることで、フェアキューがノイジーネイバー問題に対処する方法を示す図。テナント A がノイジーな場合、SQS は他のテナント (B、C、D) からのメッセージを返して、処理中のメッセージがテナント間で均等に分散されるようにします。テナント (B、C、D) のドウェル時間は短いままで、テナント A のメッセージのドウェル時間はキューバックログが消費されるまで長くなります。
注記

Amazon SQS はテナントあたりの消費率を制限しません。これにより、コンシューマーの容量があり、キューに返すべき他のメッセージがない場合、ノイジーネイバーのテナントからのメッセージもコンシューマーが受信できるようにします。Amazon SQS 標準キューと同様に、フェアキューはほぼ無制限のスループットを提供し、キュー内のテナント数にも制限はありません。

FIFO キューとの違い

FIFO キューは、各テナントからの処理中のメッセージの数を制限することで、厳密な順序を維持します。これにより、ノイジーネイバーを防止できますが、テナントごとにスループットが制限されます。フェアキューは、高スループット、低ドウェル時間、公平なリソース割り当てが優先されるマルチテナントシナリオ向けに設計されています。フェアキューを使用すると、複数のコンシューマーが同じテナントからのメッセージを同時に処理しながら、すべてのテナントが一貫したドウェル時間を維持できます。

フェアキューの使用

メッセージプロデューサーは、送信メッセージに MessageGroupId を設定することでテナント識別子を追加できます。

// Send message with tenant identifier SendMessageRequest request = new SendMessageRequest() .withQueueUrl(queueUrl) .withMessageBody(messageBody) .withMessageGroupId("tenant-123"); // Tenant identifier sqs.sendMessage(request);

公平性機能は、MessageGroupId プロパティを持つメッセージに対して、すべての Amazon SQS 標準キューに自動的に適用されます。コンシューマーコードを変更する必要はありません。API レイテンシーには影響せず、スループットの制限もありません。

フェアキュー CloudWatch メトリクス

Amazon SQS には、ノイジーネイバーの影響を軽減する状況をモニタリングするための追加の CloudWatch メトリクスを提供します。例えば、Approximate..InQuietGroups メトリクスを標準のキューレベルのメトリクスと比較できます。特定のテナントのトラフィックが急増すると、一般的なキューレベルのメトリクスによって、バックログの増加やメッセージ経過時間が古くなる可能性があります。ただし、クワイエットグループを個別に見ると、ほとんどのノイジーでないメッセージグループやテナントは影響を受けていないことが確認できます。

以下に、ノイジーテナントが原因で標準キューバックログメトリクス (ApproximateNumberOfMessagesVisible) が増加し、ノイジーではないテナントのバックログ (ApproximateNumberOfMessagesVisibleInQuietGroups) は低いままである例を示します。

Graph showing queue backlog spike for noisy groups while quiet groups remain low.

Amazon SQS CloudWatch メトリクスとその説明を含めた完全なリストについては、「Amazon SQS の CloudWatch メトリクス」を参照してください。