こんにちは。ソリューション事業部のイズメルです。Amazon Simple Queue Service(SQS)で効率的なメッセージ プロセスを実現するにはどうするか調べる機会があったので、その結果をこちらで共有いたします。

SQSとは

Amazon Simple Queue Service(SQS)は、アプリケーション間で非同期的なメッセージの送受信を可能にする、完全マネージド メッセージング サービスです。特にスケーラブルなマイクロサービスや分散システムの設計において、SQSは欠かせない存在となっています。まず、SQSの「FIFO」と「Standard」タイプについて紹介し、効率的なメッセージを処理するためのストラテジーについてご紹介します。

SQS Standard

まず、SQS Standardキューは、高スループットかつ柔軟なメッセージングに向いています。Standardキューは、メッセージの順序を厳密に保つ必要がないシステムや、多少の重複が許容されるシナリオに適しています。このキューのメリットは、スループットの向上と自動スケーリングです。大量のリクエストを同時に処理できるので、Webアプリやログ収集といったケースによく使用されます。

SQS FIFO

次に、SQS FIFO(First-In-First-Out)です。メッセージの順序を保証し、重複を防ぐためのキューです。例えば、金融取引や注文処理など、順序が重要なアプリケーションで適しています。FIFOキューでは、順序と一意性が保たれて処理されます。

ストラテジー

それでは、私が考える効率的なメッセージ処理を実現するためのストラテジーを紹介します。

バッチオペレーション

バッチオペレーションを使用すると、メッセージの処理効率が向上します。SQSでは最大10件のメッセージを1回のバッチで送信または取得でき、API call数を削減するので、コストを抑えることが可能です。
下記コマンドはそれぞれメッセージをバッチ送信する際、取得する際のコマンド例です。

バッチ送信
aws sqs send-message-batch --queue-url [SQSのURL]

メッセージ取得
aws sqs receive-message --queue-url [SQSのURL] --max-number-of-messages 10

ロングポーリング

SQSのロングポーリングを活用すると、APIリクエスト数を削減できます。通常のポーリングでは、キューにメッセージが存在しない場合でも定期的にポーリングリクエストが発生しますが、ロングポーリングを使用することで、メッセージが到着するまで待機し、無駄なリクエストを減らせます。これは、WaitTimeSecondsというパラメータで指定することが可能です。

aws sqs receive-message --queue-url [SQSのURL] --wait-time-seconds 20

可視性タイムアウト

可視性タイムアウトを適切に設定することで、メッセージの重複処理を防ぐことができます。たとえば、メッセージを処理している最中に、そのメッセージが他のコンシューマーに再度配信されないようにタイムアウトを設定します。処理にかかる時間に合わせて適切なタイムアウトを設定することが重要です。

aws sqs receive-message --queue-url [SQSのURL] --visibility-timeout 30

メッセージのグルーピング

FIFOキューを使用する場合に限りますが、メッセージのグルーピングを行うことで、特定のグループ内でのみメッセージの順序が保証されます。これにより、処理の並列性を高めつつ、順序を保ちたい場面でのパフォーマンスが向上します。グルーピングを活用することで、アプリケーションの柔軟性がさらに高まります。

aws sqs send-message --message-group-id [任意の値]

メッセージのグルーピングを1つにするか、複数にするかで処理速度が目に見えて変わります。ここは、今後のコラムで紹介したいと思います。

おわりに

Amazon SQSは、柔軟性に優れたメッセージング ソリューションであり、適切なストラテジーを組み合わせて活用することで、メッセージ処理の効率化が図れます。SQS FIFOとStandardキューの特性を理解し、バッチオペレーションやロングポーリング、可視性タイムアウトなどを活用することで、リソースを有効に使いつつ、アプリケーションのパフォーマンスを最大化できます。

ここまでお読みいただき、ありがとうございました。最後に、AWSのメッセージング サービスについてSQSを含め、Amazon MQとAmazon SNSについても「【徹底解説】AWSのメッセージングサービス」で紹介しています。