話題の記事

FIFOのAmazon SQSが2年越しで東京上陸!Exactly-Onceなキューが東京でも利用可能

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

大栗です。

SQSは1つのメッセージに対して複数回取ってしまう事があるので後続処理は冪等(べきとう)にせよ、と言われていました。それを不要にするためにFIFOのExactly-Onceなキューが発表されましたが、東京で使えず早2年が経とうとしていました。それがやっと東京にFIFOのSQSが東京に上陸しました!

Amazon SQS FIFOキュー

今まで使用していた標準キューは高いパフォーマンスを発揮しますが、以下の2点について難点がありました。そのため順序に依存しなかったり複数回実行しても問題がないように冪等な処理を書く必要がありました。

  • 順序が保証されない
  • メッセージを複数回取り出せてしまう可能性がある

この難点を解決したのがFIFOキューとなります。詳細については、以下のエントリーを御覧ください。

【新機能】Amazon SQSにFIFOが追加されました!(重複削除/単一実行/順序取得に対応)

今回東京とシドニーが増えて、6リージョンでFIFOキューが利用できます。

  • 米国東部 (バージニア北部)
  • 米国東部 (オハイオ)
  • 米国西部 (オレゴン)
  • EU (アイルランド)
  • アジアパシフィック (シドニー)New
  • アジアパシフィック (東京)New

注意

性能について

  • デフォルトでは、FIFO キューはバッチ処理により 1 秒あたり最大 3,000 件のメッセージをサポートします。制限の引き上げをリクエストする場合は、サポートリクエストを提出(クラスメソッド メンバーズにご加入の場合は弊社問い合わせ窓口へ)してください。
  • バッチ処理なしでは、FIFO キューは、1 秒あたり最大 300 件のメッセージ (1 秒あたり 300 件の送信、受信、または削除オペレーション) をサポートします。

標準キューは、 アクションあたり、ほぼ無制限の数の 1 秒あたりのトランザクション (TPS) をサポートしているため、高いパフォーマンスが必要なワークロードではFIFOキューではなく標準キューの利用をお勧めします。

名称

FIFOキューはキュー名を.fifoで終わらせる必要があります。

他サービスとの連携

FIFOキューはSNSとの連携やLambdaとの連携をサポートしていませんので注意しましょう。

キューの移行

既存の標準キューをFIFOキューへ変換することはできません。新しいFIFOキューを作成するか、既存の標準キューを削除してFIFOキューとして再作成する必要があります。

デッドレターキュー

FIFO キューのデッドレターキューは、FIFO キューである必要があります。

やってみた

東京リージョンでSQSのコンソールを開きます。ここで新しいキューの作成をクリックします。

ここではキュー名にblog.fifoとしてFIFO キューを選択します。詳細な設定内容を確認するため、一番下のキューの設定をクリックします。

キュー名が.fifoで終わっていないの以下のメッセージが表示されるので注意しましょう。

キューの名前 (blog) には無効な文字が含まれます。FIFO キューの名前は .fifo のサフィックスで終わる必要があります。

以下の様にキューの設定を行いました。

キューの属性はデフォルト値のままです。

項目 設定値 備考
デフォルトの可視性タイムアウト 30 秒
メッセージ保持期間 4 日
最大メッセージサイズ 256 KB
配信遅延 0 秒
メッセージ受信待機時間 0 秒
コンテンツに基づく重複排除 チェックなし

今回はデッドレターキュー設定を設定しません。必要に応じて設定しましょう。

項目 設定値 備考
再処理ポリシーの使用 チェックなし
デッドレターキュー
最大受信数

基本的にはサーバー側の暗号化 (SSE) の設定は設定しておきましょう。

項目 設定値 備考
SSE の使用 チェック
AWS KMS カスタマーマスターキー (CMK) (デフォルト) aws/sqs 別アカウントからのアクセスができないキー
データキー再利用期間 5 分

この様に作成されます。

AWS CLIでメッセージを送ってみます。標準キューと異なり、メッセージグループ ID(message-group-id)とメッセージ重複排除 ID(message-deduplication-id)が必要です。

$ aws sqs send-message --queue-url https://sqs.ap-northeast-1.amazonaws.com/123456789012/blog.fifo \
> --region ap-northeast-1 --message-body Developers.IO \
> --message-group-id group1 --message-deduplication-id deduplication1
{
    "MD5OfMessageBody": "12345bec1c6be3e6d735971111cf9f90",
    "SequenceNumber": "12345678901234567890",
    "MessageId": "42f4c284-1234-abcd-8345-a72f97fefeb1"
}

メッセージを取り出してみます。

$ aws sqs receive-message --queue-url https://sqs.ap-northeast-1.amazonaws.com/289237286173/blog.fifo \
>  --region ap-northeast-1 --attribute-names All
{
    "Messages": [
        {
            "Body": "Developers.IO",
            "Attributes": {
                "ApproximateFirstReceiveTimestamp": "1234567890123",
                "SequenceNumber": "12345678901234567890",
                "SenderId": "AIDAILG5DTK2YKXN3AU4W",
                "MessageDeduplicationId": "deduplication1",
                "SentTimestamp": "1234567890123",
                "ApproximateReceiveCount": "1",
                "MessageGroupId": "group1"
            },
            "ReceiptHandle": "dfgshjkdlfghjklscdhtyterwdbfjtu54yt3wfgdhru765twsgdhfju7635wrfsgdhru574635rfsgdhru4635rfsgdhu576532rqfsdfjtu7654253647urhdgsfrq25364yrufdsfafghjur4637446352rqwgdhgssdghfeytwsdhry46egdsfarq253yedgsfr523egsfasghdjrit58746352qrwhdfjncbxvzgseyur58746352qrtsghdnbfatwy37652qrshdjfgfarq45rfagswt367DTifgujvFTu=",
            "MD5OfBody": "12345bec1c6be3e6d735971111cf9f90",
            "MessageId": "42f4c284-1234-abcd-8345-a72f97fefeb1"
        }
    ]
}

さいごに

発表から2年が経ってようやく東京でもFIFOキューが利用可能になりました。FIFOキューを使いたいが為に太平洋を越えてメッセージのやり取りを行うパターンもありましたが、今回のリージョン追加で東京リージョン内で解決できるようになりました。

FIFOはとても有用な機能ですが、高いパフォーマンスが必要だったり、別のサービスとの連携(SNSやLambda)が必要な場合には標準キューを利用しましょう。