Slide 1

Slide 1 text

2023/11/16 北海道テレビ放送 三浦一樹 Serverless Operations Sonu Kim

Slide 2

Slide 2 text

お話しました

Slide 3

Slide 3 text

会長から

Slide 4

Slide 4 text

聞けなかったわぁ 再演して! 会長から

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

聞いたことある人は ごめんなさい

Slide 7

Slide 7 text

自己紹介 三浦一樹 北海道テレビ放送株式会社 Sonu Kim 株式会社Serverless Operations

Slide 8

Slide 8 text

放送に関することは いっさい仕事でやってません!

Slide 9

Slide 9 text

サービス紹介

Slide 10

Slide 10 text

2012年4月 サービス開始 前身のサービス PaaS を採用 フロントの改修が大変 スパイクに耐えられない 他の自社サービスとデータ連携できない 10 年も経つと課題が、、

Slide 11

Slide 11 text

2つサービスの開発運用 2022 年 3 月〜 2022 年 4 月〜 フルスクラッチ AWS サーバレスで

Slide 12

Slide 12 text

サーバレスのおかげでなんとか 2022 年 3 月〜 2022 年 4 月〜 エンジニア5名 3年前に未経験の人たちで スタート

Slide 13

Slide 13 text

No content

Slide 14

Slide 14 text

VPC LESS VPC LESS VPC LESS OS  LESS OS  LESS OS  LESS

Slide 15

Slide 15 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 16

Slide 16 text

ServerlessDays Tokyo 2022 Virtual 詳しくは昨年の ServerlessDays の資料で!

Slide 17

Slide 17 text

動画配信サービス hod

Slide 18

Slide 18 text

動画配信サービス hod

Slide 19

Slide 19 text

動画配信サービス hod どうでしょうの新作配信 8/30 〜

Slide 20

Slide 20 text

過去のどうでしょう新作は すべてサーバーダウン

Slide 21

Slide 21 text

放送は落ちないのにねぇ

Slide 22

Slide 22 text

放送は落ちないのにねぇ ねぇ?

Slide 23

Slide 23 text

やってやろうじゃないの

Slide 24

Slide 24 text

25,000ユーザ / 5,000 TPS を耐えられるように!! 絶対落ちないように ※オンプレ時代の情報を元にざっくり算出

Slide 25

Slide 25 text

諸事情により、AWSだけでは 無理だった制限を Momento で乗り越えた話

Slide 26

Slide 26 text

今日のお話に出てくる 覚えておいて欲しい Limit Service Quotas

Slide 27

Slide 27 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 28

Slide 28 text

課題

Slide 29

Slide 29 text

DynamoDB のホットパーテーション 多段 connection 問題 AppSync TokenConsumed 問題 近い構成で高負荷状態ではTokenが減少するの を確認済み

Slide 30

Slide 30 text

EpisodeGroup 1対多 1対多 AppSync と DynamoDB の関係 DynamoDB AppSync Program Connection ConnectionEpisode Episode 1対多 1対1 1対1 Recoil に格納 初期ロード時に 全てのデータを DynamoDB User ユーザ系のデータ(ログイン時) くらい 番組情報は 全部で10MB amplify-cli で、どんどん増やしちゃった 番組系のデータ

Slide 31

Slide 31 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 32

Slide 32 text

(別構成)AppSync と TokenConsumed 負荷をかけると1クエリあたりのToken消費が減る

Slide 33

Slide 33 text

負荷かけたけど 100 Token/query までしか下がらない

Slide 34

Slide 34 text

5000 TPS だと 5000 TPS ✖︎ 100 tokenだから quota は 50万必要...

Slide 35

Slide 35 text

AWS さん! 50万 Token まで上げて!!!

Slide 36

Slide 36 text

まぁ、一旦落ち着こうか

Slide 37

Slide 37 text

AWSさんのご提案 ・cacheを使ってみよか ・バックエンド作り直そか

Slide 38

Slide 38 text

残り2ヶ月で バックエンド作り直しは無理、、

Slide 39

Slide 39 text

cache しかない!!

Slide 40

Slide 40 text

キャッシュの 試行錯誤

Slide 41

Slide 41 text

キャッシュはVPC内サービス、、 ElastiCache はVPC使うので却下 DAX はVPC使うので却下 AppSync に cache がついてる FULL cache Per resolver cache これらも結局、ElastiCacheで時間課金 Cache 導入によるToken低減の期待 キャッシュにオフロードできたらToken減りそう 1,500KB秒以下のメモリとvCPU時間で1トークン

Slide 42

Slide 42 text

AppSync の Cache Full request caching Per-resolver caching AppSync

Slide 43

Slide 43 text

AppSync の Cache テストしてみた Full request caching Tokenが激増 6000/query Per-resolver caching ホットパーテーションは回避可能 Tokenは減らない。。 AppSync

Slide 44

Slide 44 text

これは、もう、、 デスマーチ宣言をするしか、、 ☠️

Slide 45

Slide 45 text

サーバーレスで キャッシュがあればなぁ

Slide 46

Slide 46 text

💡 渋谷の記憶が...

Slide 47

Slide 47 text

4月の渋谷の夜 photo by @TAKA_0411

Slide 48

Slide 48 text

もめんと!

Slide 49

Slide 49 text

Momentoの 導入

Slide 50

Slide 50 text

元DynamoDBを担当してた方が立ち上げた サーバーレスキャッシュサービス Momento Cache Topics

Slide 51

Slide 51 text

キムさんにMomentoの相談(本番50日前くらい) AppSync Merged API 採用の検討 フロントエンドの修正を最小限に フロントエンドver と バックエンドver の提案 キャッシュ取得の構成案をMomentoチームと相談 構成図の解説

Slide 52

Slide 52 text

AppSync の Merged API Build time アプローチ Run time アプローチ

Slide 53

Slide 53 text

AppSync の 後ろに Momento Cache

Slide 54

Slide 54 text

AppSync の subscription 使いたい

Slide 55

Slide 55 text

実際の構築 (2週間くらい)

Slide 56

Slide 56 text

実際の構成

Slide 57

Slide 57 text

更新を含めると

Slide 58

Slide 58 text

超えてきた ハードル

Slide 59

Slide 59 text

Lambdaペイロードサイズ制限 バースト耐性 momento上限緩和等 実装で気をつけたこと

Slide 60

Slide 60 text

Lambdaペイロードサイズ制限 同期呼出で6MBを超えることができず AppSyncリゾルバーではストリーミング 応答もできない 番組データのサンプルは最大10MBを想定 更新を含めると

Slide 61

Slide 61 text

JSON 文字列 圧縮バイナリ Chunk 1 (1MB) Chunk 1 (1MB) Chunk 1 (1MB) 圧縮バイナリのチャンク単位で Momentoにキャッシュさせる → 3MB 10MB ・・・ Momento Cache

Slide 62

Slide 62 text

負荷試験中、AWS Lambda でおきたスロットル

Slide 63

Slide 63 text

AWS Lambda のバースト耐性 Token Bucket Algorithm 同時実行数(Concurrency)とバースト制限 ※「AWS Lambda におけるバースト耐性」:https://aws.amazon.com/jp/builders-flash/202212/lambda-burst-resistance

Slide 64

Slide 64 text

リクエスト不可に応じたバースト制限の同時実行数とスロットリング → リトライと Provisioned Concurrency で対応 ※「AWS Lambda におけるバースト耐性」:https://aws.amazon.com/jp/builders-flash/202212/lambda-burst-resistance

Slide 65

Slide 65 text

Momentoキャッシュのサービス上限と緩和申請 ~ 5000 TPS ~ 5000 TPS × 1MB チャンクは 1MB までなので そのまま

Slide 66

Slide 66 text

Momentoチームに課題と構成案を説明・相談 ※日本語のサポートもあります! MoCon参加で前フリをしていたので、今回は英語で。

Slide 67

Slide 67 text

相談したバックエンドverの構成

Slide 68

Slide 68 text

相談したフロントエンドverの構成

Slide 69

Slide 69 text

モニタリング 負荷試験

Slide 70

Slide 70 text

負荷試験はDistributed Load Testing on AWSを使用 5,000 rps まで負荷の負荷試験を実施 20,000 Token/s まで上限緩和するために負荷試験を求めら れた AppSyncのdevとprodが同アカウントの同リージョン 段階的に上限緩和をしてもらう Momento 込みで負荷試験

Slide 71

Slide 71 text

Distributed Load Testing on AWS CloudFormation テンプレートを配布してる

Slide 72

Slide 72 text

CloudWatchメトリクスで確認 毎秒の値はCloudWatch Logs Insight で(高い) JMeterでレスポンスの情報をS3に保存 Colaboratory で集計してお金の節約 Momento のメトリクスもCloudWatchに連携 モニタリング

Slide 73

Slide 73 text

CloudWatch Dashboard dev と prod を 手動で作るの大変。。 CDKは途中で心折れた…

Slide 74

Slide 74 text

段階的に 負荷をかけていく

Slide 75

Slide 75 text

5,000 TPS クリア!!

Slide 76

Slide 76 text

CloudWatch Dashboard 負荷をかけると 反応が良くなる Momento Cache 1700ms 700ms AVG 5min Momento Cache Get Latency

Slide 77

Slide 77 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 78

Slide 78 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 79

Slide 79 text

REALLY APPRECIATE!!

Slide 80

Slide 80 text

配信当日

Slide 81

Slide 81 text

8/30 23:45:00

Slide 82

Slide 82 text

リクエスト数 AppSync

Slide 83

Slide 83 text

リクエスト数 3000 request/min AppSync

Slide 84

Slide 84 text

リクエスト数 3000 request/min あ、オンプレのデータって毎分だったのね、、 AppSync

Slide 85

Slide 85 text

リクエスト数 毎秒100くらい… AppSync

Slide 86

Slide 86 text

無風 😆

Slide 87

Slide 87 text

はじめて陥落しなかったから ヨシ!

Slide 88

Slide 88 text

まとめ

Slide 89

Slide 89 text

ついにサーバレスキャッシュがやってきた! フロントにキャッシュするしかなかった 全体でのキャッシュ戦略を考えたい NoSQL の設計をもう一度 @connection ディレクティブどうする? Amplify GraphQL Transformer v2 ? AppSync Resolver 自分で書く? 大規模な上限緩和の相談はお早めに AWSさんには本当に感謝です 負荷試験は時間かかります まとめ

Slide 90

Slide 90 text

ありがとうございました! 三浦一樹 北海道テレビ放送株式会社 Sonu Kim 株式会社Serverless Operations 2023/09/23