Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
動画配信サービスの 人気番組配信のスパイクアクセスに、 サーバレスキャッシュで立ち向かう 三浦一樹 北海道テレビ放送株式会社 Sonu Kim 株式会社Serverless Operations 2023/09/23
Slide 2
Slide 2 text
自己紹介 三浦一樹 北海道テレビ放送株式会社 Sonu Kim 株式会社Serverless Operations
Slide 3
Slide 3 text
今日のお話に出てくる 覚えておいて欲しい Limit
Slide 4
Slide 4 text
今日のお話に出てくる AWS Service Limit AppSync Rate of request tokens DynamoDB Hot Partition 2,000 /s (soft limit) 3,000 read /s 1,000 wright /s (hard limit) 1,500KB秒以下のメモリとvCPU時間で1トークン 普通に使ってると、1 TokenConsumed / 1 query
Slide 5
Slide 5 text
サービス紹介
Slide 6
Slide 6 text
2012年4月 サービス開始 前身のサービス PaaS を採用 フロントの改修が大変 スパイクに耐えられない 他の自社サービスとデータ連携できない 10 年も経つと課題が、、
Slide 7
Slide 7 text
2つサービスの開発運用 2022 年 3 月〜 2022 年 4 月〜 フルスクラッチ AWS サーバレスで
Slide 8
Slide 8 text
サーバレスのおかげでなんとか 2022 年 3 月〜 2022 年 4 月〜 エンジニア5名 3年前に未経験の人たちで スタート
Slide 9
Slide 9 text
No content
Slide 10
Slide 10 text
VPC LESS VPC LESS VPC LESS OS LESS OS LESS OS LESS
Slide 11
Slide 11 text
OIDC OIDC OIDC 全体アーキテクチャ(簡易) S3 MediaConvert S3 DynamoDB DynamoDB DynamoDB AppSync Lambda API-GW Step Functions API-GW Amplify Amplify 担当者向け CMS 倉庫 システム BFF Frontend Backend
Slide 12
Slide 12 text
ServerlessDays Tokyo 2022 Virtual 詳しくは昨年の ServerlessDays の資料で!
Slide 13
Slide 13 text
動画配信サービス hod どうでしょうの新作配信
Slide 14
Slide 14 text
https://speakerdeck.com/_kensh/serverless-virtual-waiting-room さっきの下川さんのお話
Slide 15
Slide 15 text
過去のどうでしょう新作は すべてサーバーダウン
Slide 16
Slide 16 text
放送は落ちないのにねぇ
Slide 17
Slide 17 text
やってやろうじゃないの
Slide 18
Slide 18 text
25,000ユーザ / 5,000 TPS を耐えられるように!! 絶対落ちないように ※オンプレ時代の情報を元にざっくり算出
Slide 19
Slide 19 text
課題
Slide 20
Slide 20 text
DynamoDB のホットパーテーション 多段 connection 問題 AppSync TokenConsumed 問題 近い構成で高負荷状態ではTokenが減少するの を確認済み
Slide 21
Slide 21 text
EpisodeGroup 1対多 1対多 AppSync と DynamoDB の関係 DynamoDB AppSync Program Connection ConnectionEpisode Episode 1対多 1対1 1対1 Recoil に格納 初期ロード時に 全てのデータを DynamoDB User ユーザ系のデータ(ログイン時) くらい 番組情報は 全部で10MB amplify-cli で、どんどん増やしちゃった 番組系のデータ
Slide 22
Slide 22 text
EpisodeGroup 1対多 1対多 AppSync と DynamoDB の関係 DynamoDB AppSync Program Connection ConnectionEpisode Episode 1対多 1対1 1対1 くらい 番組情報は 全部で10MB AppSync で 3000 resolver が解決 AppSync で 200 TokenConsumed DynamoDB で EpisodeTableに集中 1query で +
Slide 23
Slide 23 text
(別構成)AppSync と TokenConsumed 負荷をかけると1クエリあたりのToken消費が減る
Slide 24
Slide 24 text
負荷かけたけど 100 Token/query までしか下がらない
Slide 25
Slide 25 text
5000 TPS だと 5000 TPS ✖︎ 100 tokenだから quota は 50万必要...
Slide 26
Slide 26 text
AWS さん! 50万 Token まで上げて!!!
Slide 27
Slide 27 text
まぁ、一旦落ち着こうか
Slide 28
Slide 28 text
AWSさんのご提案 ・cacheを使ってみよか ・バックエンド作り直そか
Slide 29
Slide 29 text
残り2ヶ月で バックエンド作り直しは無理、、
Slide 30
Slide 30 text
cache しかない!!
Slide 31
Slide 31 text
キャッシュの 試行錯誤
Slide 32
Slide 32 text
キャッシュはVPC内サービス、、 ElastiCache はVPC使うので却下 DAX はVPC使うので却下 AppSync に cache がついてる FULL cache Per resolver cache これらも結局、ElastiCacheで時間課金 Cache 導入によるToken低減の期待 キャッシュにオフロードできたらToken減りそう 1,500KB秒以下のメモリとvCPU時間で1トークン
Slide 33
Slide 33 text
AppSync の Cache Full request caching Per-resolver caching AppSync
Slide 34
Slide 34 text
AppSync の Cache テストしてみた Full request caching Tokenが激増 6000/query Per-resolver caching ホットパーテーションは回避可能 Tokenは減らない。。 AppSync
Slide 35
Slide 35 text
これは、もう、、 デスマーチ宣言をするしか、、 ☠️
Slide 36
Slide 36 text
サーバーレスで キャッシュがあればなぁ
Slide 37
Slide 37 text
💡
Slide 38
Slide 38 text
4月の渋谷の夜 photo by @TAKA_0411
Slide 39
Slide 39 text
もめんと!
Slide 40
Slide 40 text
Momentoの 導入
Slide 41
Slide 41 text
キムさんにMomentoの相談(本番50日前くらい) AppSync Merged API 採用の検討 フロントエンドの修正を最小限に フロントエンドver と バックエンドver の提案 キャッシュ取得の構成案をMomentoチームと相談 構成図の解説
Slide 42
Slide 42 text
AppSync の Merged API
Slide 43
Slide 43 text
AppSync の 後ろに Momento Cache
Slide 44
Slide 44 text
AppSync の subscription 使いたい
Slide 45
Slide 45 text
実際の構築 (2週間くらい)
Slide 46
Slide 46 text
実際の構成
Slide 47
Slide 47 text
更新を含めると
Slide 48
Slide 48 text
超えてきた ハードル
Slide 49
Slide 49 text
Lambdaペイロードサイズ制限 バースト耐性 momento上限緩和等 実装で気をつけたこと
Slide 50
Slide 50 text
Lambdaペイロードサイズ制限 同期呼出で6MBを超えることができず AppSyncリゾルバーではストリーミング 応答もできない 番組データのサンプルは最大10MBを想定 更新を含めると
Slide 51
Slide 51 text
JSON 文字列 圧縮バイナリ Chunk 1 (1MB) Chunk 1 (1MB) Chunk 1 (1MB) 圧縮バイナリのチャンク単位で Momentoにキャッシュさせる → 3MB 10MB ・・・ Momento Cache
Slide 52
Slide 52 text
負荷試験中、AWS Lambda でおきたスロットル
Slide 53
Slide 53 text
AWS Lambda のバースト耐性 Token Bucket Algorithm 同時実行数(Concurrency)とバースト制限 ※「AWS Lambda におけるバースト耐性」:https://aws.amazon.com/jp/builders-flash/202212/lambda-burst-resistance
Slide 54
Slide 54 text
リクエスト不可に応じたバースト制限の同時実行数とスロットリング → リトライと Provisioned Concurrency で対応 ※「AWS Lambda におけるバースト耐性」:https://aws.amazon.com/jp/builders-flash/202212/lambda-burst-resistance
Slide 55
Slide 55 text
Momentoキャッシュのサービス上限と緩和申請 ~ 5000 TPS ~ 5000 TPS × 1MB チャンクは 1MB までなので そのまま
Slide 56
Slide 56 text
Momentoチームに課題と構成案を説明・相談 ※日本語のサポートもあります! MoCon参加で前フリをしていたので、今回は英語で。
Slide 57
Slide 57 text
相談したバックエンドverの構成
Slide 58
Slide 58 text
相談したフロントエンドverの構成
Slide 59
Slide 59 text
モニタリング 負荷試験
Slide 60
Slide 60 text
負荷試験はDistributed Load Testing on AWSを使用 5,000 rps まで負荷の負荷試験を実施 20,000 Token/s まで上限緩和するために負荷試験を求めら れた AppSyncのdevとprodが同アカウントの同リージョン 段階的に上限緩和をしてもらう Momento 込みで負荷試験
Slide 61
Slide 61 text
Distributed Load Testing on AWS CloudFormation テンプレートを配布してる
Slide 62
Slide 62 text
CloudWatchメトリクスで確認 毎秒の値はCloudWatch Logs Insight で(高い) JMeterでレスポンスの情報をS3に保存 Colaboratory で集計してお金の節約 Momento のメトリクスもCloudWatchに連携 モニタリング
Slide 63
Slide 63 text
CloudWatch Dashboard dev と prod を 手動で作るの大変。。 CDKは途中で心折れた…
Slide 64
Slide 64 text
5,000 TPS クリア!!
Slide 65
Slide 65 text
CloudWatch Dashboard 負荷をかけると 反応が良くなる Momento Cache 1700ms 700ms AVG 5min Momento Cache Get Latency
Slide 66
Slide 66 text
もともとは AppSync Rate of request tokens DynamoDB Hot Partition 2,000 /s (soft limit) AppSync DynamoDB 200 3,000 read /s 1,000 wright /s (hard limit) TokenConsumed
Slide 67
Slide 67 text
上限緩和とMomento の導入 AppSync Rate of request tokens DynamoDB Hot Partition 2,000 /s (soft limit) Momento が 受けてくれる! 20,000 /s ↓ AppSync Lambda Resolver Momento Cache Concurrent executions 20,000 + Provisioned Concurrency 1 TokenConsumed
Slide 68
Slide 68 text
REALLY APPRECIATE!!
Slide 69
Slide 69 text
配信当日
Slide 70
Slide 70 text
8/30 23:45:00
Slide 71
Slide 71 text
リクエスト数 AppSync
Slide 72
Slide 72 text
リクエスト数 3000 request/min AppSync
Slide 73
Slide 73 text
リクエスト数 3000 request/min あ、オンプレのデータって毎分だったのね、、 AppSync
Slide 74
Slide 74 text
リクエスト数 毎秒100くらい… AppSync
Slide 75
Slide 75 text
無風 😆
Slide 76
Slide 76 text
はじめて陥落しなかったから ヨシ!
Slide 77
Slide 77 text
まとめ
Slide 78
Slide 78 text
ついにサーバレスキャッシュがやってきた! フロントにキャッシュするしかなかった 全体でのキャッシュ戦略を考えたい NoSQL の設計をもう一度 @connection ディレクティブどうする? Amplify GraphQL Transformer v2 ? AppSync Resolver 自分で書く? 大規模な上限緩和の相談はお早めに AWSさんには本当に感謝です 負荷試験は時間かかります まとめ
Slide 79
Slide 79 text
ありがとうございました! 三浦一樹 北海道テレビ放送株式会社 Sonu Kim 株式会社Serverless Operations 2023/09/23