Slide 1

Slide 1 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 1 ABEMAのCM配信を 支えるスケーラブルな 分散カウンタの実装 2025 November 19 Honoka Toda

Slide 2

Slide 2 text

AbemaTV, Inc. All Rights Reserved
 戸田 朋花 Honoka Toda 株式会社CyberAgent / 株式会社AbemaTV CM配信システムのバックエンドの開発を担当 2 Profile hono0130__ hono0130 2025年未踏IT 曾川PMプロジェクトのクリエイター

Slide 3

Slide 3 text

AbemaTV, Inc. All Rights Reserved
 3

Slide 4

Slide 4 text

AbemaTV, Inc. All Rights Reserved
 ABEMA 無料 すべてのひとが楽しめる ⽣中継 ライブならではの臨場感 同時性 ⽇本のイマを捉え流⾏をつくる 報道 常に新鮮なニュース 利便性 時間と場所からの開放 ABOUT ABEMA

Slide 5

Slide 5 text

AbemaTV, Inc. All Rights Reserved
 5

Slide 6

Slide 6 text

AbemaTV, Inc. All Rights Reserved
 6 1. CM配信における課題 2. カウンターの設計 3. Google Cloud上での実装 4. 様々な種類のカウンターの実装 5. さらなるスループットの向上 INDEX

Slide 7

Slide 7 text

AbemaTV, Inc. All Rights Reserved
 CM配信における課題 7

Slide 8

Slide 8 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 CM配信における課題 8 ABEMAのCM配信はパーソナライズ可能 多種多様なイベントを処理しないといけない 候補A 0回視聴 候補B 1回視聴 候補A 30代女性 候補B 20代女性 候補C 20代男性 ユーザーの視聴履歴に基づく広告配信 ユーザーの属性に基づく広告配信

Slide 9

Slide 9 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 CM配信における課題 9 目標インプレッションに近づけるように配信を制御する 広告A: 目標200 広告A: 実績50 広告配信サーバー カウント 現在の広告Aの実績は? 50 インプレッション=広告の表示回数

Slide 10

Slide 10 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 CM配信における課題 10 目標インプレッションに近づけるように配信を制御する 広告A: 目標200 広告A: 実績50 広告配信サーバー カウント 50 広告Aを計150人に配信 現在の広告Aの実績は?

Slide 11

Slide 11 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 CM配信における課題 11 大量のインプレッションで処理が詰まると計測が遅れる 広告A: 目標200 広告A: 実績50 広告配信サーバー カウント 広告Aに+125 インプレッションが発火 処理が詰まると計測が遅れる +1 +1 +1

Slide 12

Slide 12 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 CM配信における課題 12 計測が遅れた状態で配信制御すると実績と目標が乖離する 広告A: 目標200 広告A: 実績100 広告配信サーバー カウント 100 過小な実績を返却(本当は175) 現在の広告Aの実績は?

Slide 13

Slide 13 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 CM配信における課題 13 広告A: 目標200 広告配信サーバー カウント 広告Aを計100人に配信 広告A: 実績100 100 過小な実績を返却(本当は175) 現在の広告Aの実績は? 計測が遅れた状態で配信制御すると実績と目標が乖離する

Slide 14

Slide 14 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 合計250 目標オーバー💥 CM配信における課題 14 広告A: 目標200 広告A: 実績175 広告配信サーバー カウント 広告Aに+75 インプレッションが発火 計測が遅れた状態で配信制御すると実績と目標が乖離する

Slide 15

Slide 15 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 CM配信における課題 15 人気番組の生放送ではトラフィックがスパイクする 広告配信サーバーのあるサービスのRPS 広告配信サーバーにリクエストがくるのは広告配信前後だけ 人気番組の生放送時は広告前後で急激にスパイクする 1分で約200倍にスパイク

Slide 16

Slide 16 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 CM配信における課題 16 高スループット 多様で大量のイベントをリアルタイムに捌く必要がある 読み取りも書き込みもスケーラブル 高カーディナリティなデータも扱える

Slide 17

Slide 17 text

AbemaTV, Inc. All Rights Reserved
 カウンターの設計 17

Slide 18

Slide 18 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 カウンターの設計 18

Slide 19

Slide 19 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 カウンターの設計 19 値の正確性を犠牲にする代わりに高速に書き込むレイヤー

Slide 20

Slide 20 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 カウンターの設計 20 定期的にデータを確定させて値を補正するレイヤー

Slide 21

Slide 21 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 カウンターの設計 21 ホットストレージとコールドストレージを使った読み取り

Slide 22

Slide 22 text

AbemaTV, Inc. All Rights Reserved
 Google Cloud 上での実装 22

Slide 23

Slide 23 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 Google Cloud 上での実装 23

Slide 24

Slide 24 text

AbemaTV, Inc. All Rights Reserved
 Google Cloud 上での実装 24 ストリーム

Slide 25

Slide 25 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 Google Cloud 上での実装 25 ストリームはPub/Subを採用 複数サブスクリプションを作ればファンアウトできる ストリーム

Slide 26

Slide 26 text

AbemaTV, Inc. All Rights Reserved
 Google Cloud 上での実装 26 ホットストレージ

Slide 27

Slide 27 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 Google Cloud 上での実装 27 ホットストレージはマネージドのValkey Cluster を利用 ホットストレージ

Slide 28

Slide 28 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 Google Cloud 上での実装 28 Valkey Cluster は in-memory key/value store の Valkey のクラスタ構成 in-memory store なので高スループット クラスタ構成では読み書きの水平スケールが可能 ホットストレージ

Slide 29

Slide 29 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 Google Cloud 上での実装 29 Valkey Cluster は key のハッシュ値でシャーディングする ノードが水平スケールし読み書きの負荷分散が可能 ホットストレージ

Slide 30

Slide 30 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 Google Cloud 上での実装 30 リードレプリカで読み取りのスケールが可能 リードレプリカを追加することで 読み取りの負荷を分散できる ホットストレージ

Slide 31

Slide 31 text

AbemaTV, Inc. All Rights Reserved
 Google Cloud 上での実装 31 イベントストレージ

Slide 32

Slide 32 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 Google Cloud 上での実装 32 イベントストレージは BigQuery を利用 イベントストレージ

Slide 33

Slide 33 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 Google Cloud 上での実装 33 BigQuery は Partitioning によりスキャン範囲を減らせる Column1でPartitioningした例 カラムの値によってテーブルが 物理的に分割される クエリの際は該当するPartitionしか スキャンされない イベントストレージ

Slide 34

Slide 34 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 Google Cloud 上での実装 34 カウント時刻で Partitioning してクエリを効率化 スキャン範囲を絞って コストとパフォーマンス を最適化 イベントストレージ

Slide 35

Slide 35 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 Google Cloud 上での実装 35 BigQuery は Clustering によりデータの並び替えができる Column1でClusteringした例 レコードがカラムの値の順序で並び替えられて配置される スキャン範囲の最適化や集約の効率化が可能になる イベントストレージ

Slide 36

Slide 36 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 Google Cloud 上での実装 36 カウンターのキーで Clustering してクエリを効率化 イベントストレージ

Slide 37

Slide 37 text

AbemaTV, Inc. All Rights Reserved
 Google Cloud 上での実装 37 コールドストレージ

Slide 38

Slide 38 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 Google Cloud 上での実装 38 コールドストレージは Spanner を利用 コールドストレージ

Slide 39

Slide 39 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 Google Cloud 上での実装 39 Spanner は Google Cloud で利用できる分散 RDB 処理性能やストレージの増減が簡単にできる マネージドサービスなのでメンテナンス不要 コールドストレージ

Slide 40

Slide 40 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 Google Cloud 上での実装 40 Spanner は比較的小規模から利用可能で低コストに使える 最小単位の100Unitではコンピュート料金月$85 簡単にデプロイできるオートスケーラーがある 同じSLAの場合CloudSQLで最低月$480、AlloyDBで$581 オートスケールを活用すれば比較的安価に利用できる 全て東京リージョン - Spanner は Standard Edition で 100 unitsの場合 - CloudSQL は Enterprise Plus Edition で HA 構成有効、db-perf-optimized-N-2 が 1 ノードの場合 - AlloyDB は 2vCPU で HA 構成が有効の場合 参考 コールドストレージ

Slide 41

Slide 41 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 Google Cloud 上での実装 41 Spanner では主キーの順でレコードが物理配置される Primary key1と Primary key2の 複合主キーの場合 コールドストレージ

Slide 42

Slide 42 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 Google Cloud 上での実装 42 カウンターのキーとカウント時刻を主キーにすることで 時間範囲のクエリを効率的に行うことが可能 コールドストレージ

Slide 43

Slide 43 text

AbemaTV, Inc. All Rights Reserved
 Google Cloud 上での実装 43 コンピュート

Slide 44

Slide 44 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 Google Cloud 上での実装 44 ライターと補正バッチはGKE上のPod / CronJob コンピュート

Slide 45

Slide 45 text

AbemaTV, Inc. All Rights Reserved
 様々な種類のカウンターの実装 45

Slide 46

Slide 46 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 Google Cloud 上での実践 46 ● カウンター ● 時系列カウンター ● ユニークカウンター カウンターの種類として以下を設計

Slide 47

Slide 47 text

AbemaTV, Inc. All Rights Reserved
 様々な種類のカウンターの実装 47 カウンター

Slide 48

Slide 48 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 様々な種類のカウンターの実装 48 カウンターはKeyに対して値を数え上げる カウンター クライアント keyがuser1の カウント値は? 1 keyがuser1:20250101の カウント値は? 5 カウンター

Slide 49

Slide 49 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 様々な種類のカウンターの実装 49 Valkey 上では String 型によって表現できる カウンター

Slide 50

Slide 50 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 様々な種類のカウンターの実装 50 INCRBY でカウントアップし、GETで値を取得 カウンター

Slide 51

Slide 51 text

AbemaTV, Inc. All Rights Reserved
 様々な種類のカウンターの実装 51 時系列カウンター

Slide 52

Slide 52 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 様々な種類のカウンターの実装 52 時系列カウンターは時間範囲での取得が可能なカウンター カウンター クライアント keyがcampaign1の 直近1分のカウント値は? 13 時系列カウンター

Slide 53

Slide 53 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 様々な種類のカウンターの実装 53 Valkey では Sorted Set 型を使うと範囲取得が可能になる $ ZRANGEBYSCORE key1 1 10 member1 member2 member3 時系列カウンター

Slide 54

Slide 54 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 様々な種類のカウンターの実装 54 Score を UNIX タイムスタンプ、Memberをカウント値 にすれば範囲取得が可能 しかし、このままだと カウント値を インクリメントできない… 時系列カウンター

Slide 55

Slide 55 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 様々な種類のカウンターの実装 55 Hash型は1つの key に複数の key value を持たせられる型 時系列カウンター

Slide 56

Slide 56 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 様々な種類のカウンターの実装 56 書き込み時に Hash を利用することでインクリメント可能 時系列カウンター

Slide 57

Slide 57 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 様々な種類のカウンターの実装 57 Hash で書き込んで定期的に Sorted Set に変換することで 時系列カウンターを実現可能! 時系列カウンター

Slide 58

Slide 58 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 様々な種類のカウンターの実装 58 Valkey の Functions 機能を使うことで高速に変換できる Functions は Valkey に事前に関数を登録すると その関数を呼び出すことで指定の処理ができる機能 ノード上で実行されるので、同じノードに存在しているデータのみ取り扱える 時系列カウンター

Slide 59

Slide 59 text

AbemaTV, Inc. All Rights Reserved
 様々な種類のカウンターの実装 59 ユニークカウンター

Slide 60

Slide 60 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 様々な種類のカウンターの実装 60 ユニークカウンターはユニーク数を数えるカウンター ユニークユーザーの計測等に活用できる カウンター クライアント keyがcampaign1の ユニークな値の数は? 3 ユニークカウンター

Slide 61

Slide 61 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 様々な種類のカウンターの実装 61 ユニーク数を愚直に数えるには全ての値を持つ必要がある カーディナリティが高い場合にデータ量が大きくなる カウンター クライアント key1にvalue5を登録 value1 value4 +value5 key1にvalue4を登録 value1 value4 value5 既にあるので 何も行わない ユニークカウンター

Slide 62

Slide 62 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 様々な種類のカウンターの実装 62 ユニーク数は HyperLogLog で効率的に表現できる HyperLogLogとは 集合のカーディナリティを推定できる確率的データ構造 データ量が小さく済む代わりに誤差が発生する ユニークカウンター

Slide 63

Slide 63 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 様々な種類のカウンターの実装 63 Valkey の HyperLogLog 型を利用するだけで実装可能 ユニークカウンター

Slide 64

Slide 64 text

AbemaTV, Inc. All Rights Reserved
 さらなるスループットの向上 64

Slide 65

Slide 65 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 さらなるスループットの向上 65 Valkey は同じキーの書き込みに対してはスケールできない 特定のキーへの書き込みが集中する場合 複数ノードでの負荷分散ができないため 単一ノードの性能以上はでない

Slide 66

Slide 66 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 さらなるスループットの向上 66 異なる Key に分割して書き込んで 後からそれをマージできれば書き込みがスケールするはず key1をkey1:1とkey1:2に分割

Slide 67

Slide 67 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 さらなるスループットの向上 67 CRDT (Conflict-free Replicated Data Type)とは 「コンフリクトの生じないデータ型」 複数の場所で同じデータに対して更新が独立に行われても それらの変更をコンフリクトせずにマージ可能な型 これを活用することで結果整合性を持たせられる

Slide 68

Slide 68 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 さらなるスループットの向上 68 加算のみ可能なカウンターは GCounter と呼ばれ 代表的なCRDTである

Slide 69

Slide 69 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 さらなるスループットの向上 69 GCounterは加算しかしないので単調増加する ノード間で状態が異なる場合は最大値をとってマージ

Slide 70

Slide 70 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 さらなるスループットの向上 70 データ構造を工夫すれば Valkey 上でGCounterを表現可能 Keyのハッシュ値でシャーディングするので Keyのサフィックスに 論理的なパーティションをつけて ノード間で分散させる

Slide 71

Slide 71 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 さらなるスループットの向上 71 イベントは 1 つの論理パーティションにのみ書き込める

Slide 72

Slide 72 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 さらなるスループットの向上 72 定期的に各パーティションの値をマージする 1. 全てのパーティションの値を取得する

Slide 73

Slide 73 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 さらなるスループットの向上 73 定期的に各パーティションの値をマージする 2. 各パーティションについて  最大の値で上書きする

Slide 74

Slide 74 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 さらなるスループットの向上 74 クライアントはどれかの論理パーティションからGETし 各カウンターの値を足し合わせれば最終的な値が得られる

Slide 75

Slide 75 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 さらなるスループットの向上 75 GCounterとしてキーを分割することで Valkey 単体性能を超えた性能を出すことができる! GCounterで学ぶ、CRDTによるスケーラブルな書き込み処理と結果整合性 | CyberAgent Developers Blog 以前ブログでも解説しているのでよかったら読んでください🙏

Slide 76

Slide 76 text

AbemaTV, Inc. All Rights Reserved