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