[AWS] SNSメッセージをSQSでサブスクライブする

マイクロサービス化する場合にモジュール間を疎結合に保つためコレオグラフィアーキテクチャを採用できるところではしたくなります。

コレオグラフィについてはQiitaの以下の記事が参考になります。

そこでpub/subの仕組みをどうやって実装するか?という課題ができてきますがAWSであればSNS/SQSが利用できます。
以下のスライドや記事が参考になります。


これで本番運用しよう!と思った時に1つ疑問が出てきました。
SNS->SQSとメッセージを送る際にSQSが障害などで利用できなくなっていた場合にSNSにパブリッシュされたメッセージはどうなるのか?まさか消えちゃうとか無いよね?と。

答えはFAQにありました。

Q: サブスクライブしているエンドポイントが利用できない場合、Amazon SNS メッセージはどうなりますか?

SNS に送信されたすべてのメッセージは、直ちに処理されて配信されます。最初の試行でメッセージが正常に配信されない場合、SNS では次の 4 段階の再試行ポリシーに従った処理が行われます。(1) 遅延なしの再試行、(2) 最小遅延間隔での再試行、(3) バックオフモデル (線形または指数的) を使用した再試行、(4) 最大遅延間隔での再試行です。
ポリシーはエンドポイントによって、以下のように異なります。

SQS: SQS キューが利用できない場合、SNS は直ちに 10 回、続いて 20 秒間隔で 100,000 回の再試行を行います。つまり 23 日あまりで合計 100,010 回の再試行が行われます。この再試行後に配信されないメッセージは SNS から破棄されます。

SQSへの送信が失敗した場合のメッセージの消失については23日間障害が続くというのは考えにくいですし、十分にリトライ処理がされるようなのであまり気にしなくても大丈夫そうです。

とはいえ、SQSが利用できない間はサービスが利用できない状態になると復旧までにかかる時間によっては何か考えないといけないです。
全リージョンで同時に障害というのはあまりないのでマルチリージョンで構築するというのも1つのやり方のようですがどの程度まで担保するかは要検討。