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
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