$30 off During Our Annual Pro Sale. View Details »

動画配信サービスの 人気番組配信のスパイクアクセスに、 サーバレスキャッシュで立ち向かう

Kazuki Miura
September 23, 2023

動画配信サービスの 人気番組配信のスパイクアクセスに、 サーバレスキャッシュで立ち向かう

Kazuki Miura

September 23, 2023
Tweet

More Decks by Kazuki Miura

Other Decks in Technology

Transcript

  1. 動画配信サービスの
    人気番組配信のスパイクアクセスに、
    サーバレスキャッシュで立ち向かう
    三浦一樹
    北海道テレビ放送株式会社
    Sonu Kim
    株式会社Serverless Operations
    2023/09/23

    View Slide

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

    View Slide

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

    View Slide

  4. 今日のお話に出てくる 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

    View Slide

  5. サービス紹介

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  9. View Slide

  10. VPC LESS
    VPC LESS
    VPC LESS
    OS
     LESS
    OS
     LESS
    OS
     LESS

    View Slide

  11. OIDC
    OIDC
    OIDC
    全体アーキテクチャ(簡易)
    S3 MediaConvert S3
    DynamoDB
    DynamoDB
    DynamoDB
    AppSync
    Lambda
    API-GW
    Step Functions
    API-GW
    Amplify
    Amplify
    担当者向け
    CMS
    倉庫
    システム
    BFF
    Frontend Backend

    View Slide

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

    View Slide

  13. 動画配信サービス hod
    どうでしょうの新作配信

    View Slide

  14. https://speakerdeck.com/_kensh/serverless-virtual-waiting-room
    さっきの下川さんのお話

    View Slide

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

    View Slide

  16. 放送は落ちないのにねぇ

    View Slide

  17. やってやろうじゃないの

    View Slide

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

    View Slide

  19. 課題

    View Slide

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

    View Slide

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

    View Slide

  22. 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 で

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  27. まぁ、一旦落ち着こうか

    View Slide

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

    View Slide

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

    View Slide

  30. cache しかない!!

    View Slide

  31. キャッシュの
    試行錯誤

    View Slide

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

    View Slide

  33. AppSync の Cache
    Full request caching
    Per-resolver caching
    AppSync

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  37. 💡

    View Slide

  38. 4月の渋谷の夜 photo by @TAKA_0411

    View Slide

  39. もめんと!

    View Slide

  40. Momentoの
    導入

    View Slide

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

    View Slide

  42. AppSync の Merged API

    View Slide

  43. AppSync の 後ろに Momento Cache

    View Slide

  44. AppSync の subscription 使いたい

    View Slide

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

    View Slide

  46. 実際の構成

    View Slide

  47. 更新を含めると

    View Slide

  48. 超えてきた
    ハードル

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  59. モニタリング
    負荷試験

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  64. 5,000 TPS
    クリア!!

    View Slide

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

    View Slide

  66. もともとは
    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

    View Slide

  67. 上限緩和と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

    View Slide

  68. REALLY
    APPRECIATE!!

    View Slide

  69. 配信当日

    View Slide

  70. 8/30 23:45:00

    View Slide

  71. リクエスト数
    AppSync

    View Slide

  72. リクエスト数
    3000 request/min
    AppSync

    View Slide

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

    View Slide

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

    View Slide

  75. 無風
    😆

    View Slide

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

    View Slide

  77. まとめ

    View Slide

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

    View Slide

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

    View Slide