#serverlessdays https://serverless.connpass.com/event/290640/
動画配信サービスの人気番組配信のスパイクアクセスに、サーバレスキャッシュで立ち向かう三浦一樹北海道テレビ放送株式会社Sonu Kim株式会社Serverless Operations2023/09/23
View Slide
自己紹介三浦一樹北海道テレビ放送株式会社Sonu Kim株式会社Serverless Operations
今日のお話に出てくる覚えておいて欲しい Limit
今日のお話に出てくる AWS Service LimitAppSyncRate of request tokensDynamoDBHot Partition2,000 /s (soft limit)3,000 read /s1,000 wright /s(hard limit)1,500KB秒以下のメモリとvCPU時間で1トークン普通に使ってると、1 TokenConsumed / 1 query
サービス紹介
2012年4月 サービス開始前身のサービスPaaS を採用フロントの改修が大変スパイクに耐えられない他の自社サービスとデータ連携できない10年も経つと課題が、、
2つサービスの開発運用2022年 3月〜 2022年 4月〜フルスクラッチAWSサーバレスで
サーバレスのおかげでなんとか2022年 3月〜 2022年 4月〜エンジニア5名3年前に未経験の人たちでスタート
VPC LESSVPC LESSVPC LESSOS LESSOS LESSOS LESS
OIDCOIDCOIDC全体アーキテクチャ(簡易)S3 MediaConvert S3DynamoDBDynamoDBDynamoDBAppSyncLambdaAPI-GWStep FunctionsAPI-GWAmplifyAmplify担当者向けCMS倉庫システムBFFFrontend Backend
ServerlessDays Tokyo 2022 Virtual詳しくは昨年の ServerlessDaysの資料で!
動画配信サービス hodどうでしょうの新作配信
https://speakerdeck.com/_kensh/serverless-virtual-waiting-roomさっきの下川さんのお話
過去のどうでしょう新作はすべてサーバーダウン
放送は落ちないのにねぇ
やってやろうじゃないの
25,000ユーザ / 5,000 TPSを耐えられるように!!絶対落ちないように※オンプレ時代の情報を元にざっくり算出
課題
DynamoDB のホットパーテーション多段 connection 問題AppSync TokenConsumed 問題近い構成で高負荷状態ではTokenが減少するのを確認済み
EpisodeGroup1対多1対多AppSync と DynamoDB の関係DynamoDBAppSyncProgramConnectionConnectionEpisode Episode1対多1対11対1Recoilに格納初期ロード時に全てのデータをDynamoDB Userユーザ系のデータ(ログイン時)くらい番組情報は全部で10MBamplify-cliで、どんどん増やしちゃった番組系のデータ
EpisodeGroup1対多1対多AppSync と DynamoDB の関係DynamoDBAppSyncProgramConnectionConnectionEpisode Episode1対多1対11対1くらい番組情報は全部で10MBAppSync で 3000 resolver が解決AppSync で 200 TokenConsumedDynamoDB で EpisodeTableに集中1query で+
(別構成)AppSync と TokenConsumed負荷をかけると1クエリあたりのToken消費が減る
負荷かけたけど100 Token/queryまでしか下がらない
5000 TPS だと5000 TPS ✖︎ 100 tokenだからquota は 50万必要...
AWS さん!50万 Token まで上げて!!!
まぁ、一旦落ち着こうか
AWSさんのご提案・cacheを使ってみよか・バックエンド作り直そか
残り2ヶ月でバックエンド作り直しは無理、、
cache しかない!!
キャッシュの試行錯誤
キャッシュはVPC内サービス、、ElastiCache はVPC使うので却下DAX はVPC使うので却下AppSync に cache がついてるFULL cachePer resolver cacheこれらも結局、ElastiCacheで時間課金Cache 導入によるToken低減の期待キャッシュにオフロードできたらToken減りそう1,500KB秒以下のメモリとvCPU時間で1トークン
AppSync の CacheFull request cachingPer-resolver cachingAppSync
AppSync の Cache テストしてみたFull request cachingTokenが激増 6000/queryPer-resolver cachingホットパーテーションは回避可能Tokenは減らない。。AppSync
これは、もう、、デスマーチ宣言をするしか、、☠️
サーバーレスでキャッシュがあればなぁ
💡
4月の渋谷の夜 photo by @TAKA_0411
もめんと!
Momentoの導入
キムさんにMomentoの相談(本番50日前くらい)AppSync Merged API 採用の検討フロントエンドの修正を最小限にフロントエンドver と バックエンドver の提案キャッシュ取得の構成案をMomentoチームと相談構成図の解説
AppSync の Merged API
AppSync の 後ろに Momento Cache
AppSync の subscription 使いたい
実際の構築(2週間くらい)
実際の構成
更新を含めると
超えてきたハードル
Lambdaペイロードサイズ制限バースト耐性momento上限緩和等実装で気をつけたこと
Lambdaペイロードサイズ制限同期呼出で6MBを超えることができずAppSyncリゾルバーではストリーミング応答もできない番組データのサンプルは最大10MBを想定更新を含めると
JSON文字列 圧縮バイナリChunk 1 (1MB)Chunk 1 (1MB)Chunk 1 (1MB)圧縮バイナリのチャンク単位でMomentoにキャッシュさせる→ 3MB10MB・・・Momento Cache
負荷試験中、AWS Lambda でおきたスロットル
AWS Lambda のバースト耐性Token Bucket Algorithm同時実行数(Concurrency)とバースト制限※「AWS Lambda におけるバースト耐性」:https://aws.amazon.com/jp/builders-flash/202212/lambda-burst-resistance
リクエスト不可に応じたバースト制限の同時実行数とスロットリング→ リトライと Provisioned Concurrency で対応※「AWS Lambda におけるバースト耐性」:https://aws.amazon.com/jp/builders-flash/202212/lambda-burst-resistance
Momentoキャッシュのサービス上限と緩和申請~ 5000 TPS~ 5000 TPS × 1MBチャンクは 1MB までなのでそのまま
Momentoチームに課題と構成案を説明・相談※日本語のサポートもあります!MoCon参加で前フリをしていたので、今回は英語で。
相談したバックエンドverの構成
相談したフロントエンドverの構成
モニタリング負荷試験
負荷試験はDistributed Load Testing on AWSを使用5,000 rps まで負荷の負荷試験を実施20,000 Token/s まで上限緩和するために負荷試験を求められたAppSyncのdevとprodが同アカウントの同リージョン段階的に上限緩和をしてもらうMomento 込みで負荷試験
Distributed Load Testing on AWSCloudFormation テンプレートを配布してる
CloudWatchメトリクスで確認毎秒の値はCloudWatch Logs Insight で(高い)JMeterでレスポンスの情報をS3に保存Colaboratory で集計してお金の節約Momento のメトリクスもCloudWatchに連携モニタリング
CloudWatch Dashboarddev と prod を手動で作るの大変。。CDKは途中で心折れた…
5,000 TPSクリア!!
CloudWatch Dashboard負荷をかけると反応が良くなるMomento Cache1700ms700msAVG 5minMomento Cache Get Latency
もともとはAppSyncRate of request tokensDynamoDBHot Partition2,000 /s (soft limit)AppSync DynamoDB2003,000 read /s1,000 wright /s(hard limit)TokenConsumed
上限緩和とMomento の導入AppSyncRate of request tokensDynamoDBHot Partition2,000 /s (soft limit)Momento が受けてくれる!20,000 /s↓AppSync LambdaResolverMomentoCacheConcurrent executions20,000+ Provisioned Concurrency1TokenConsumed
REALLYAPPRECIATE!!
配信当日
8/30 23:45:00
リクエスト数AppSync
リクエスト数3000 request/minAppSync
リクエスト数3000 request/minあ、オンプレのデータって毎分だったのね、、AppSync
リクエスト数毎秒100くらい…AppSync
無風😆
はじめて陥落しなかったからヨシ!
まとめ
ついにサーバレスキャッシュがやってきた!フロントにキャッシュするしかなかった全体でのキャッシュ戦略を考えたいNoSQL の設計をもう一度@connection ディレクティブどうする?Amplify GraphQL Transformer v2 ?AppSync Resolver 自分で書く?大規模な上限緩和の相談はお早めにAWSさんには本当に感謝です負荷試験は時間かかりますまとめ
ありがとうございました!三浦一樹北海道テレビ放送株式会社Sonu Kim株式会社Serverless Operations2023/09/23