こんにちは。ソリューション事業部のイズメルです。以前、Amazon SQSについてのコラムを投稿しました。

Amazon SQSのFIFOキューは、メッセージの順序と重複排除を保証することができるため、取引データや注文処理のように順序が重要なシステムに最適です。ここでは、SQS FIFOのメッセージグルーピングを活用して、メッセージを効率的に直列処理・並列処理する方法について解説します。

SQS FIFOキューとメッセージグルーピングの基本

SQS FIFOキューは、メッセージの一貫した順序処理を保証しますが、メッセージ数が増えると処理速度に影響を与えることもあります。

ここで重宝するのが、messageGroupId を使ってメッセージをグループでまとめることです。messageGroupIdは、特定のグループに属するメッセージを一つの「シーケンス」として扱うため、同じグループ内で順序を守りながらも、異なるグループは並列処理が可能になります。

messageGroupIdを1つだけ使用する場合

messageGroupIdを1つのみ使用すると、FIFOキュー内の全メッセージが単一のグループとして処理されるため、すべてのメッセージが一貫した順序で処理されます。しかし、すべてのメッセージが直列処理されるため、処理速度はコンシューマー数に依存せず、一度に1件ずつ処理することになります。

メリット

  • メッセージの順序が完全に保証される。
  • シンプルな構成で実装が容易。

messageGroupIdを複数使用する場合

一方で、複数の messageGroupIdを使用すると、異なるグループ内のメッセージは並列に処理できます。これにより、処理速度が向上し、システムが高負荷に耐える能力も向上します。たとえば、顧客ごとに messageGroupIdを割り当てることで、異なる顧客のリクエストを同時に処理でき、処理待機時間が減少します。このアプローチでは、各グループ内のメッセージ順序は保持されながらも、システム全体のスループットが改善されます。

messageGroupIdの実際の動作については、文字のみでは理解しずらいと思います。
これには、2018年のre:Inventで行われたデモがAWS公式のYouTubeで紹介されているので、合わせてご覧いただくと理解が深まるかと思います。
AWS re:Invent 2018: Choosing the Right Messaging Service for Your Distributed App (API305)

上記ハイパーリンクから飛べない場合は、こちらのURLをコピーしてご使用ください。
URL: https://www.youtube.com/watch?v=4-JmX6MIDDI&ab_channel=AmazonWebServices

デモのタイムスタンプは、「SQS FIFO Queue Demo」 (23:28) です。(言語: 英語)

SQS FIFO Queue Demo

メリット

  • 異なるグループ間での並列処理が可能になり、処理速度が向上。
  • コンシューマーを増やすことで、システムのスケーラビリティが向上。

効果的なメッセージグルーピングの実装方法

メッセージグルーピングの効果を最大限に引き出すには、適切な messageGroupIdの設計が重要です。たとえば、ユーザーIDや注文IDといった特定のIDを基にグルーピングを行うことで、関連するメッセージが同じグループ内に収まり、他のグループとの並列処理が容易になります。さらに、コンシューマーの負荷を分散させるため、グループサイズと数も調整することが推奨されます。

終わりに

Amazon SQS FIFOキューのメッセージグルーピングを活用すれば、直列処理と並列処理のバランスを取り、効率的なメッセージ処理が可能になります。messageGroupIdを適切に設定し、コンシューマーによる並列処理を最大化することで、SQS FIFOキューのパフォーマンスが向上し、メッセージ処理速度を最適化できます。

SQSやその他メッセージングサービスについては、SunnyCloudの過去コラムでも取り上げています。ぜひ合わせてご覧ください。