絶対に止めれないシステムとは
もちろん銀行システムとかのクリティカルなシステムもそうなのですが、今回は、そこまでではないのですが、データ連携上一部のapiは止めれないシステムを指します。
僕は直面したのが、Lineでのユーザー登録によるwebhookを受け取るって奴です。
昔のキャリアのユーザー登録であれば、止まっていた時には別途データが飛んできてまとめて処理とかも出来ましたが、Lineさんのはありません。ユーザー登録時のwebhookを取りこぼすと2度と受信出来ないのです。
同様にSNS等で登録時にwebhookが来て、対応する必要があるシステムもあると思います。
LINE、現在は再送機能があるみたいです。
https://developers.line.biz/ja/news/2022/04/19/webhook-redelivery/
どうすれば良いか?
先ず思うのは、AWSでLambdaで受け取って処理すれば良いと思うでしょう。
これでも良いのですが、Lambdaがエラー処理で落ちたりすることもあります。
最初の構成
この構成の場合は、通常時は良いのですが、トラブル時にデータをロストしてしまいます。
- webhook側でエラー
- ALBとEC2の通信障害
トラブル以外にもデプロイ時のwebサービスの再起動等の時もデータがロストしてしまいます。
改善したシステム構成
なので下記構成にしました。
ALB->Lambda->SQS->Lambda->webhook(API)
1.最初ALBからlambdaを呼び出す
2.lambdaは、SQSでキューを登録し終
3.別のlambdaを定期的起動させ、SQSのキューをチェックさせる
4.キューがあったら、取り出し、webhookAPIをコールする
2でキューを追加する場合は、冪等性を担保するために、そのデータが以前に処理されたことがあるかどうかをチェックします。
最後に
これによりシステム停止時にも問題なく稼働するシステムが構築できましたが、SQSでなくても、S3に保存したり、
他にもやり方はあると思います。
皆さんが考えたaws構成について教えて下さい