[アップデート] Amazon SNS の FIFO トピックに高スループットモードが追加されたので重複排除の挙動がどう変わるのか検証してみた
いわさです。
先日のアップデートで Amazon SNS の FIFO トピックに高スループットモードが追加されました。
従来 Amazon SQS には高スループットモードの概念が存在していました[1]が Amazon SNS に今回初めて追加されました。
この高スループットモード、現在は FIFO トピックを新規作成しようとするとデフォルトで選択され、マネジメントコンソール上も「スループットを最大にするには推奨」という表記があります。
スループット上のメリットがある一方、コンソール上で補足されているようにこちらを有効化することで従来と重複排除の挙動が変わります。
そのためスループットが向上するということでよくわからずに有効化するのではなく、この点を意識して有効化しないと少し危ないので、今回は実際にどう挙動が変わるのかを検証してみましたので紹介します。
Amazon SNS のスループットの変更点
まず変更点の前に Amazon SNS とスループットの考え方を軽く整理しておきます。
Amazon SNS のメインリソースは「トピック」です。管理者は各トピックを作成しアプリケーションはトピックに対してメッセージを送信します。
トピックには、標準トピックと FIFO トピックの 2 つのタイプがあります。標準トピックは最大スループットがサポートされているがパブリッシュされたメッセージの順序付けはベストエフォート、FIFO トピックは厳密な順序付けが可能だがスループットはそれなり、などいくつかの点で相違点があります。[2]
そして FIFO トピックですが「メッセージグループ」という概念が重要になってきます。
メッセージの発行時にメッセージグループ ID を指定します。順序付けはこの同一メッセージグループ内で維持されます。
また FIFO トピック全体は 3,000 MPS(メッセージ/秒)なのですが、メッセージグループごとにも 300 MPS という上限があり、メッセージグループの分散をうまく行わないと最大 300 MPS しか性能が出ないということになります。
Amazon SNS message grouping for FIFO topics - Amazon Simple Notification Serviceより
高スループットオプションのスコープを選択できるように
今回のアップデートで次のように FIFO トピックのオプションが追加されています。
スタンダードトピックの場合はこちらのオプションは存在していません。
新規 FIFO トピック作成画面
メッセージグループスコープが今回追加されたモードで、こちらを選択すると最大制限まで利用できる高スループットモードということになります。
トピックスコープは従来のモードで、こちらはトピック全体で 3,000 MPS 固定のようです。
ちなみにこのトピックあたりの最大スループット上限ですが、Service Quotas からアカウントレベルで上限緩和ができる項目になっています。
バージニア北部リージョンはデフォルト 30,000 MPS[3] が設定されていますが、SNS コンソール上のトピックスコープについては 3,000 MPS が最大となっています。
一方で、メッセージグループあたり 300 MPS という制限が高スループットモードの場合に排除されたわけではないようです。
よって、メッセージグループの分散を効率的に行いつつ今回の高スループットモードを有効化することでスタンダードトピックと同じ程度のスループットが出せるようになると考えて良さそうです。
バージニア北部リージョンの Service Quotas デフォルト値
注意点として、東京リージョンの Service Quotas デフォルト値は、私の AWS アカウントで 1,500 MPS でした。
東京リージョンでは高スループットモードを有効化する場合はあわせて上限緩和したほうが良いですね。
高スループットの設定ですが、新規トピックのマネジメントコンソール上のデフォルトは「メッセージグループスコープ」となっていました。
また、アップデート前から存在するものは未設定となっており、「トピックスコープ」となるようです。
こちらの設定の注意点がもうひとつありまして、トピックスコープ → メッセージグループスコープ へは変更ができるのですが、メッセージグループスコープ → トピックスコープ への変更ができません。
Amazon SNS の重複排除の挙動が変わる
こちらが重要な点ですが、今回の機能は無条件にスループットが向上するというものではありません。
このオプションはスループットを最大にするために、重複排除のスコープを狭くします。
ここで Amazon SNS の重複排除機能についても少し整理しておきます。
SNS トピックへメッセージを発行する際に、FIFO トピックの場合はメッセージグループ ID と、メッセージ重複排除 ID を追加で指定します。(メッセージ重複排除 ID は重複排除の方法によっては指定しない場合もある)
このメッセージ重複排除 ID ですが、一定期間内の同一メッセージ重複排除 ID をもつメッセージは重複しているとみなされて配信されません。[4]
ただし、重複検証する「スコープ」がありまして、それが今回の高スループットモードと関係しています。
まず、従来のトピックスコープの場合はトピック内で同一の重複排除 ID が重複とみなされていました。
メッセージグループスコープの場合は同一メッセージグループ内で同一の重複排除 ID が重複とみなされ、、同一トピックでもメッセージグループが異なる場合は重複しているとみなされなくなります。
ここを意識せずに高スループットのためにメッセージグループスコープを有効化すると、重複排除されるはずと思っていたメッセージがされなくなる場合がありますので注意が必要です。
重複排除の挙動を検証する
スループット測定も少し気になりますが、今回はどちらかというと挙動が変わる重複排除の動きを検証してみたいと思います。
次のようにメッセージグループと重複排除 ID を指定した 4 つのメッセージをトピックスコープのトピックと、メッセージグループスコープのトピックへ送信してみます。
メッセージグループ | 重複排除ID | メッセージ |
---|---|---|
A | 1 | a |
B | 2 | b |
A | 1 | c |
A | 2 | d |
トピックスコープの動き
まずは従来のトピックスコープの動きを確認してみます。
ハイスループット値にトピックスコープを指定した FIFO トピックを作成しています。
コンソール上からメッセージを 4 件送信したところ、1 件目と 3 件目、2 件目と 4 件目が同じメッセージ ID となりました。3 件目と 4 件目が重複していると判断されています。4 件目は同一メッセージグループ上に同一の重複排除 ID をもつメッセージは存在していませんが、トピックを通して重複しているため重複していると判断されていますね。
配信ログを見てみると 2 件しか送信されていないことが確認出来ます。
メッセージグループスコープの動き
つづいて高スループットモードのメッセージグループスコープも同じように試してみましょう。
こちらは 1 件目と 3 件目だけが重複していると判断され、メッセージ ID が同じものとなりました。
そして配信ログには 3 件の履歴が。先ほどと異なり 4 件目のメッセージは同一メッセージグループ内に同一の重複排除 ID が存在しないため重複したメッセージではないと判断されました。
さいごに
今回は Amazon SNS の FIFO トピックに高スループットモードが追加されたので重複排除の挙動がどう変わるのか検証してみました。
FIFO トピックを使いつつ高いスループットを得ることができるのはとても良いですね。
一方で従来と重複排除の動きが変わるので、挙動の変化の認識した上で適切なケースで有効化したいところです。