こんにちは。ソリューション事業部のイズメルです。以前、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) です。(言語: 英語)
メリット
- 異なるグループ間での並列処理が可能になり、処理速度が向上。
- コンシューマーを増やすことで、システムのスケーラビリティが向上。
効果的なメッセージグルーピングの実装方法
メッセージグルーピングの効果を最大限に引き出すには、適切な messageGroupId
の設計が重要です。たとえば、ユーザーIDや注文IDといった特定のIDを基にグルーピングを行うことで、関連するメッセージが同じグループ内に収まり、他のグループとの並列処理が容易になります。さらに、コンシューマーの負荷を分散させるため、グループサイズと数も調整することが推奨されます。
終わりに
Amazon SQS FIFOキューのメッセージグルーピングを活用すれば、直列処理と並列処理のバランスを取り、効率的なメッセージ処理が可能になります。messageGroupId
を適切に設定し、コンシューマーによる並列処理を最大化することで、SQS FIFOキューのパフォーマンスが向上し、メッセージ処理速度を最適化できます。
SQSやその他メッセージングサービスについては、SunnyCloudの過去コラムでも取り上げています。ぜひ合わせてご覧ください。