#前提
あなたは、小さめの会社のインフラエンジニアだ
幸いなことに会社は オンプレではなくクラウドサービス 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が管理してくれてくれるから大丈夫
・・・復帰しないサービス
プログラムやデータの不具合は あなたしか直せないので
やはり あなたは旅行に行くべきではない
サーバだけでなく、エンジニアもバックアップ作ることが 次の目標です