AWS
Kinesis
serverless

大量リクエストをさばくにはサーバレス&非同期の導入を検討してはいかがか?

前提

あなたは、小さめの会社のインフラエンジニアだ
幸いなことに会社は オンプレではなくクラウドサービス AWSを使っている
残念なことに システムを全て理解出来るのはあなたしかいない

大量アクセスがきたら?

想定外の大量アクセスがきたらサーバはどうなるだろうか?
処理がおいつかず サーバエラーが表示されたり
サーバが落ちる事もある

でもオートスケーリングがあるじゃない?

インスタンスの立ち上げに数分かかる。
DBのレプリケーションもデータ同期まで時間がかかる。
じわじわとアクセスが増えれば、設定次第では起動間に合うが
CMが出た、アイドルが宣伝した、イベント開始 など、一気にスパイクが来ることの方が多い
そのようなスパイクに耐える方法もあるが、たとえば 常に多めにサーバインスタンスを立ち上げるなど。
しかし それではお金がかかる

オートスケーリングは スパイクに対しては信用できない
あなたは 24時間サービスを監視し、なにか障害があればすぐに駆けつけなければならない
あなたは 旅行にはいけないし、親戚に不幸があっても行くことが出来ない。

超大量リクエストきたら?

実際に 知り合いのサービスは 急なスパイクでフロントサーバが100台以上立ち上がった
Readだけなら問題ないが、DBへのWriteをふくむアクセスの場合
DBをレプリケーションしたとしても、マスターがボトルネックになり レスポンスが悪くなり
最悪DBが落ちる
もちろん、シャーディングで対応すれば それも回避できるはず!

Amazonにインフラ監視まかせられない?

もちろん物理的なサーバトラブルはAmazonが今でも保証してくれているが
サービスやインスタンスの管理はしてくれない

ところが AWSにはマネージドサービス つまり SaaS的なサービスがいくつかある
DBだとDynamoDBなど
これらを使えば、サービスの監視をAmazonに委ねる事ができる
しかも オートスケーリングと違い、AWSが必要に応じて瞬時にスケーリングしてくれる
NoSQLになるので、設計は色々変える必要が出てくるが・・・

DBはこれで 管理しなくてよくなった!
だが Webサーバは管理必要なので、まだ旅行に行けない

#API Gateway
API Gatewayという、指定したURLに対するアクセスがあった場合に
指定したイベントを呼ぶ(後に出る LambdaやDBなど)
いわゆる Routingのコントローラーである
当然 これも AWSマネージドなので、大量アクセスも気にしなくてよい

Lambda

上記のAPI Gatewayから特定URLがアクセスされた時の動きを記述する Modelだ
AWSだと node、go、Java、Pythonなど いろいろな言語で記述出来る
これも マネージドなので、自動的にスケーリングしてくれる

完璧??

API Gatewayでリクエストをうけ
Lambdaでロジックをかき
DynamoDBに R/W する

サーバレス&フルマネージド!
安心して旅行行ける??

そう、ある程度までの規模のアクセスなら、これで完成だが
超大量アクセスが来た場合、DynamoDBが料金が高くなるのもあるし、アクセス数も制限がある

Queue

直接DynamoDBに入れるから問題が起こるので
いったん Queueにためて 非同期処理をすれば、アクセスが集中しても DBへのR/Wは時間を分散できる
もちろん、リアルタイムに結果が返ってくる必要があるサービスには向かないが
実は非同期で問題ないサービスは非常に多い

AWSのキューサービスは複数あるが 代表的なものは
SQS: 順番が保証されない
SQS FIFO: 順番保証されるがパフォーマンス悪い
Kinesis: 順番が保証され大量データに強い

ということで 私はKinesisをおすすめ

API Gateway -> Lambda -> Kinesis --> DynamoDB

これで 超大量アクセスがあっても、まず問題なく 非同期アクセスが可能

これで旅行に行ける!

EMR

DynamoDBは Writeがけっこう高い・・
ので 超大量アクセスを処理する安くて速い方法は?

Hadoopですね

HadoopはAWSではEMRでマネージドされてます

API Gateway -> Lambda -> Kinesis --> EMR(Hadoop) -> DynamoDB

場合によっては、Hadoopを使ってバッチ処理をするほうがいいかもしれませんね

最後に

サーバレス(マネージドサービス)により あなたは旅行に行けました

スマートフォンにアラートが来る
Amazonが管理してくれてくれるから大丈夫
・・・復帰しないサービス

プログラムやデータの不具合は あなたしか直せないので
やはり あなたは旅行に行くべきではない

サーバだけでなく、エンジニアもバックアップ作ることが 次の目標です