SlideShare una empresa de Scribd logo
1 de 78
Ameba広告の配信制御
アーキテクチャを
刷新した話
オレシカナイト vol.3
2017-09-27
About me
About me
• 駒原 雄祐 (こまはら ゆうすけ)
• (株)サイバーエージェント (2010~)
MDH アドテクノロジー局所属
• サーバサイドエンジニア
• Ameba Infeed開発責任者(2015~)
About me
• SIer出身
• サイバーエージェント入社後
• 課金プラットフォーム
• コミュニティサービス
• 2012年からAmebaの広告のお仕事
• 妻と娘(1歳)とチワワ(3歳)の3人と1匹暮らし
今日のテーマ
Ameba広告の配信制御
アーキテクチャを刷新
した話
配信制御?
ネット広告配信の流れ
作成しているデータ1
• 静的なデータ(マスタデータなど)
• 広告枠などの配信面の情報
• どのフォーマットの広告を何個返すか
• 配信したくないNG業種や広告主
• 出稿側の情報
• 広告主、広告キャンペーン、配信先プレースメント、入札情報など
• 広告のクリエイティブ情報(画像、テキスト、動画など) etc…
作成しているデータ2
• 動的なデータ
• 広告枠ごとに対する配信候補のインデック
スなど
(様々な条件で時々刻々と変わる)
当初のアーキテクチャ
3分間隔(当初)で
設定DBの有効なデータの
全量抽出
配信に適した形への加工
キャッシュサーバへの
PUT
バッチサーバが作成した
キャッシュデータを
世代別に保持
定期的に最新世代のポーリング
世代が更新されたら
キャッシュサーバの
データを吸い上げ
オンメモリで保持
良いところ
• シンプルな構成でランニングコストが低い
• オンメモリで必要な全データをキャッシュするため低レイテンシ
• RDBと配信が切り離されているため、RDBがボトルネックになる
心配がない
• RDB側のスキーマ変更等による配信への影響もない
• キャッシュ作成時に問題が起きても、次の世代の処理が成功すれば
大丈夫、という安心感
ちなみに
この仕組みについて2016年に弊社公式エンジニ
アブログで執筆したのでそちらもぜひご一読を
https://ameblo.jp/principia-ca/entry-12145898865.html
当時は「A.J.A.」という
ブランド名でやってまし
たが、いろいろあって現
在は「Ameba Infeed」と
いう名前でやってます
運用を続けるうちに
課題が顕在化
データ量の増加
ビジネス拡大に伴って
データ量が増大
処理時間が長くなり
3分間隔のバッチが
3分では終わらなくなる
単一サーバのため
スケールもできない
データ量増大により
容量を逼迫
スケールアップで凌ぐ日々
データ量増大により
メモリ逼迫でGCコスト増大
吸い上げにも時間が
かかるように
結果
当初3分間隔だったバッチ
↓
10分間隔に
バッチ間隔が延びると・・・
• 配信設定の追加/変更や、ON/OFFなどが
なかなか配信に反映されない
• 予算切れになってもなかなか配信が止ま
らない
アーキテクチャレベルで
刷新することを決断
アーキテクチャレベルで
刷新することを決断
この時点ではこんなに大変だ
とは考えていなかった・・・
刷新の方針(状態目標)
• DBでのデータ更新から配信への反映は当初と同じ3
分以内を目標
• スケールしないポイントを作らない
• 全データアドサーバ上でのオンメモリにはこだわら
ない
• ただしレイテンシの悪化は許容範囲内に抑える
それを踏まえた実装方針1
• 配信設定のデータソースはRDBのまま
• データソースまで変えると改修範囲がシステム
のほぼ全域に及んでしまう
• オンラインでの既存データの移行が現実的でな
い
• 配信時にRDBを直接参照しない点は踏襲
それを踏まえた実装方針2
• 世代ごとに毎回全量を作成する方式をやめる
• 静的なデータは随時差分更新に
(時間あたりの更新対象は少ない)
• 動的なデータは一定間隔で全量更新
(時間あたりの更新対象は多い)
• アドサーバがキャッシュサーバを直接参照する方式から
、APIで配信データを提供する方式に
刷新版アーキテクチャ
(ver.1)
RDBはこれまでよりも
高い並列度のクエリを捌くため、
Read Replicaを立てて
HAProxy + ELBで負荷分散
(ここは苦肉の策・・・)
キャッシュサーバに
配信制御に必要な静的データ、
動的データが格納される
ここにデータが入ることが
ひとまずのゴール
配信制御APIがアドサーバ
からのリクエストに対し
キャッシュサーバを参照して
レスポンスを返す
ジョブスケジューラが
キャッシュに載せる
データの種類と抽出条件
(例えば最終更新が5分以内の
キャンペーンとか)
をパラメータにAPIコール
ID Partitioner
APIが指定された条件で
DBに対し更新対象のデータのIDを
取得するためにSELECT。
取得したIDごとにメッセージを
作成しKinesisに流す
Synchronizer Workerが
Kinesisからメッセージを取
り出して該当IDに対する
キャッシュデータを作成。
キャッシュサーバにPUT
ポイント
• 更新対象のデータ種別、条件を指定できるようにし、差分
更新を可能に
• 現在の設定では最終更新から5分以内の条件で毎分起動
(エラー時のリトライも兼ねて)
• IDの抽出と、それに対するキャッシュデータ生成とを分離
し、Kinesis Streamで非同期化することで並列化しやすく
した
Kinesis Stream
• AWSのフルマネージドなデータストリーミングサービス
• 複数のConsumerアプリケーションに出力できる
• シャード数を調整することで、スループットに応じたス
ケーリングが設定できる
• KCLというConsumer用のクライアントライブラリが提
供されている
結果
問題点1
• 並列度を上げた結果、RDBのレイヤーでRead
Replica + HAProxyでもスループットが上がら
ず、性能要件を満たせない
• ある程度以上更新データが混み合うと急激
にスローダウンする
問題点2
• Kinesis Stream(KCL?)の特性上、シャードと
クライアントとが1:1に紐づいてしまう
• 特定のクライアントノードでスローダウンが
発生したときに他のノードで補い合えない
• 遅いクライアントが掴んでいるシャードに入
ったメッセージがどんどん遅れてしまう
問題点2 - 図解
問題点2 - 図解
問題点2 - 図解
Shard 3に入ったメッセージだけ
どんどん反映が遅れていく
刷新後アーキテクチャ
(ver.2)
RDBをMySQLから
Amazon Auroraに
• AuroraはAWSが提供するMySQL互換のハイ
パフォーマンス、高可用なDBエンジン
• 元のMySQLと比較して、同じ構成でのスルー
プットが大きく改善して一気に解決
• アプリケーションには(既存のものも含めて)
一切手を入れなくてもよかった (素晴らしい)
RDBをMySQLから
Amazon Auroraに
• AWSが提供するMySQL互換のハイパフォー
マンス、高可用なDBエンジン
• 元のMySQLと比較して、同じ構成でのスルー
プットが大きく改善して一気に解決
• アプリケーションには(既存のものも含めて)
一切手を入れなくてもよかった (素晴らしい)
RDSでのMySQL → Aurora
移行もやりました。
興味ある方は懇親会で
つかまえてください
非同期化部分をKinesis Stream
からSQSに
• SQSはAWSが提供するフルマネージド
なメッセージキューイングサービス
• リソースの空いているコンシューマア
プリケーションがSQSにメッセージを
取りに行くため、特定のデータが遅延
していくという心配がなく、均一に
結果
問題点
• 静的なデータの更新量が多い状況下では
Synchronizer Workerが混み合い、更新対象の
多い動的なデータの定期的な更新が追いつか
ない
• それでも更新要求は一定間隔で送り続けるた
め、ジョブがどんどん溜まってしまう
刷新後アーキテクチャ
(ver.3)
ver.2からの変更点
• Synchronizer Workerの後ろにさらにもう一段SQSと
Worker(Indexer)を設け、動的なデータ(定期的に全量を洗い直すデ
ータ)はそちらに流すようにした
• Indexerは広告枠が生きている限り、インデックスデータを作成し
たらまたIndexer用SQSにキューイングし、ループすることで繰り
返し処理を行う
• Indexer用のSQSには30秒の遅延キューの設定を入れた
(30秒+αの時間間隔で動的データが更新される)
解決!
• SQSの遅延キューの仕組みを利用し、動的デ
ータが静的データの影響を受けずに一定間隔
(30秒+α)でデータがリフレッシュされる仕組
みが実現できた
結果
無事リリース
配信制御のリプレース
無事完了
目的は達成できたのか
• DBでのデータ更新から配信への反映は当初と同じ3
分以内を目標
• スケールしないポイントを作らない
• 全データアドサーバ上でのオンメモリにはこだわら
ない
• ただしレイテンシの悪化は許容範囲内に抑える
• DBでのデータ更新から配信への反映は当初と同じ3
分以内を目標
• スケールしないポイントを作らない
• 全データアドサーバ上でのオンメモリにはこだわら
ない
• ただしレイテンシの悪化は許容範囲内に抑える
目的は達成できたのか
データの更新量により上下するが
概ね2分以内で反映
• DBでのデータ更新から配信への反映は当初と同じ3
分以内を目標
• スケールしないポイントを作らない
• 全データアドサーバ上でのオンメモリにはこだわら
ない
• ただしレイテンシの悪化は許容範囲内に抑える
目的は達成できたのかDB、キャッシュはもとより、各モ
ジュールが分散並列処理できるよ
うになったため、スケールアウト
によるスケーリングが可能に
目的は達成できたのか
• DBでのデータ更新から配信への反映は当初と同じ3
分以内を目標
• スケールしないポイントを作らない
• 全データアドサーバ上でのオンメモリにはこだわら
ない
• ただしレイテンシの悪化は許容範囲内に抑える
平均レイテンシ
約50ms→約65ms
なんとか許容範囲と思える範囲内に
抑えることができた
リリース後
2017年8月に完全移行
• 配信制御API
• ピーク時70000qps程度
• レイテンシ3~4ms前後
• 配信への反映
• 概ね2分以内を維持
今後の課題
• 配信制御APIのレスポンスをもう少し速くしたい
• 1回の配信で何度も叩かれるAPIなので、1msの改善が全体では大
きくレイテンシの改善につながる
• DSP(=Demand Side Platform)などレイテンシ要件が厳しいもの
にも不安なく使えるようにしたい
• インフラコストの削減
• システムが複雑化した分、インフラコストは膨らんでしまった
ご清聴ありがとうございました

Más contenido relacionado

La actualidad más candente

Convolutionl Neural Network 入門
Convolutionl Neural Network 入門Convolutionl Neural Network 入門
Convolutionl Neural Network 入門
maruyama097
 
AWS クラウドで構築するスマホアプリ バックエンド
AWS クラウドで構築するスマホアプリ バックエンドAWS クラウドで構築するスマホアプリ バックエンド
AWS クラウドで構築するスマホアプリ バックエンド
kaki_k
 

La actualidad más candente (20)

ゲームオブジェクトの管理
ゲームオブジェクトの管理ゲームオブジェクトの管理
ゲームオブジェクトの管理
 
JVMパラメータチューニングにおけるOptunaの活用事例 ( Optuna Meetup #1 )
JVMパラメータチューニングにおけるOptunaの活用事例 ( Optuna Meetup #1 ) JVMパラメータチューニングにおけるOptunaの活用事例 ( Optuna Meetup #1 )
JVMパラメータチューニングにおけるOptunaの活用事例 ( Optuna Meetup #1 )
 
ABEMA を次のフェーズへ進化させる技術への取り組み
ABEMA を次のフェーズへ進化させる技術への取り組みABEMA を次のフェーズへ進化させる技術への取り組み
ABEMA を次のフェーズへ進化させる技術への取り組み
 
継続的なモデルモニタリングを実現するKubernetes Operator
継続的なモデルモニタリングを実現するKubernetes Operator継続的なモデルモニタリングを実現するKubernetes Operator
継続的なモデルモニタリングを実現するKubernetes Operator
 
SageMakerを使った異常検知
SageMakerを使った異常検知SageMakerを使った異常検知
SageMakerを使った異常検知
 
Amazon Game Tech Night #25 ゲーム業界向け機械学習最新状況アップデート
Amazon Game Tech Night #25 ゲーム業界向け機械学習最新状況アップデートAmazon Game Tech Night #25 ゲーム業界向け機械学習最新状況アップデート
Amazon Game Tech Night #25 ゲーム業界向け機械学習最新状況アップデート
 
レコメンドエンジン作成コンテストの勝ち方
レコメンドエンジン作成コンテストの勝ち方レコメンドエンジン作成コンテストの勝ち方
レコメンドエンジン作成コンテストの勝ち方
 
Docker入門 - 基礎編 いまから始めるDocker管理
Docker入門 - 基礎編 いまから始めるDocker管理Docker入門 - 基礎編 いまから始めるDocker管理
Docker入門 - 基礎編 いまから始めるDocker管理
 
CVPR 2020 報告
CVPR 2020 報告CVPR 2020 報告
CVPR 2020 報告
 
教師なしGNNによるIoTデバイスの異常通信検知の検討
教師なしGNNによるIoTデバイスの異常通信検知の検討教師なしGNNによるIoTデバイスの異常通信検知の検討
教師なしGNNによるIoTデバイスの異常通信検知の検討
 
実践 Amazon Mechanical Turk ※下記の注意点をご覧ください(回答の質の悪化・報酬額の相場の変化・仕様変更)
実践 Amazon Mechanical Turk ※下記の注意点をご覧ください(回答の質の悪化・報酬額の相場の変化・仕様変更)実践 Amazon Mechanical Turk ※下記の注意点をご覧ください(回答の質の悪化・報酬額の相場の変化・仕様変更)
実践 Amazon Mechanical Turk ※下記の注意点をご覧ください(回答の質の悪化・報酬額の相場の変化・仕様変更)
 
より高品質なメディアサービスを目指す ABEMA の技術進化
より高品質なメディアサービスを目指す ABEMA の技術進化より高品質なメディアサービスを目指す ABEMA の技術進化
より高品質なメディアサービスを目指す ABEMA の技術進化
 
アドテクを支える技術 〜1日40億リクエストを捌くには〜
アドテクを支える技術 〜1日40億リクエストを捌くには〜アドテクを支える技術 〜1日40億リクエストを捌くには〜
アドテクを支える技術 〜1日40億リクエストを捌くには〜
 
CNNの誤差逆伝播/Deconvolutionの計算過程
CNNの誤差逆伝播/Deconvolutionの計算過程CNNの誤差逆伝播/Deconvolutionの計算過程
CNNの誤差逆伝播/Deconvolutionの計算過程
 
ヤフーのAIプラットフォーム紹介 ~AIテックカンパニーを支えるデータ基盤~ #yjtc
ヤフーのAIプラットフォーム紹介 ~AIテックカンパニーを支えるデータ基盤~ #yjtcヤフーのAIプラットフォーム紹介 ~AIテックカンパニーを支えるデータ基盤~ #yjtc
ヤフーのAIプラットフォーム紹介 ~AIテックカンパニーを支えるデータ基盤~ #yjtc
 
SSII2020 [OS2] 限られたデータからの深層学習 (オーガナイザーによる冒頭の導入)
SSII2020 [OS2] 限られたデータからの深層学習 (オーガナイザーによる冒頭の導入)SSII2020 [OS2] 限られたデータからの深層学習 (オーガナイザーによる冒頭の導入)
SSII2020 [OS2] 限られたデータからの深層学習 (オーガナイザーによる冒頭の導入)
 
マイクロアドにおけるCTR予測への取り組み
マイクロアドにおけるCTR予測への取り組みマイクロアドにおけるCTR予測への取り組み
マイクロアドにおけるCTR予測への取り組み
 
InternetWeek2022 - インターネット広告の羅針盤
InternetWeek2022 - インターネット広告の羅針盤InternetWeek2022 - インターネット広告の羅針盤
InternetWeek2022 - インターネット広告の羅針盤
 
Convolutionl Neural Network 入門
Convolutionl Neural Network 入門Convolutionl Neural Network 入門
Convolutionl Neural Network 入門
 
AWS クラウドで構築するスマホアプリ バックエンド
AWS クラウドで構築するスマホアプリ バックエンドAWS クラウドで構築するスマホアプリ バックエンド
AWS クラウドで構築するスマホアプリ バックエンド
 

Destacado

Destacado (10)

ストリーム処理エンジン「Zero」の開発と運用
ストリーム処理エンジン「Zero」の開発と運用ストリーム処理エンジン「Zero」の開発と運用
ストリーム処理エンジン「Zero」の開発と運用
 
re:Invent 行ってきた
re:Invent 行ってきたre:Invent 行ってきた
re:Invent 行ってきた
 
goで末尾再帰最適化は使えるか?
goで末尾再帰最適化は使えるか?goで末尾再帰最適化は使えるか?
goで末尾再帰最適化は使えるか?
 
DSPでgolangの屍を超えた話 (オレシカナイト Vol.2)
DSPでgolangの屍を超えた話 (オレシカナイト Vol.2)DSPでgolangの屍を超えた話 (オレシカナイト Vol.2)
DSPでgolangの屍を超えた話 (オレシカナイト Vol.2)
 
1年目でgolangとscalaを触った話
1年目でgolangとscalaを触った話1年目でgolangとscalaを触った話
1年目でgolangとscalaを触った話
 
iQONを支えるクローラーの裏側
iQONを支えるクローラーの裏側iQONを支えるクローラーの裏側
iQONを支えるクローラーの裏側
 
Test Yourself - テストを書くと何がどう変わるか
Test Yourself - テストを書くと何がどう変わるかTest Yourself - テストを書くと何がどう変わるか
Test Yourself - テストを書くと何がどう変わるか
 
コンピュータビジョンの今を映す-CVPR 2017 速報より- (夏のトップカンファレンス論文読み会)
コンピュータビジョンの今を映す-CVPR 2017 速報より- (夏のトップカンファレンス論文読み会)コンピュータビジョンの今を映す-CVPR 2017 速報より- (夏のトップカンファレンス論文読み会)
コンピュータビジョンの今を映す-CVPR 2017 速報より- (夏のトップカンファレンス論文読み会)
 
ICCV 2017 速報
ICCV 2017 速報 ICCV 2017 速報
ICCV 2017 速報
 
NIPS2015読み会: Ladder Networks
NIPS2015読み会: Ladder NetworksNIPS2015読み会: Ladder Networks
NIPS2015読み会: Ladder Networks
 

Similar a Ameba広告の配信制御アーキテクチャを刷新した話 ~オレシカナイトvol.3~

Similar a Ameba広告の配信制御アーキテクチャを刷新した話 ~オレシカナイトvol.3~ (20)

201107_Flamingo_kanai
201107_Flamingo_kanai201107_Flamingo_kanai
201107_Flamingo_kanai
 
Digital marketing on AWS
Digital marketing on AWSDigital marketing on AWS
Digital marketing on AWS
 
インターネットテレビ局「AbemaTV」における Googleアナリティクス360の活用事例
インターネットテレビ局「AbemaTV」における Googleアナリティクス360の活用事例 インターネットテレビ局「AbemaTV」における Googleアナリティクス360の活用事例
インターネットテレビ局「AbemaTV」における Googleアナリティクス360の活用事例
 
Webサイトの分析と改善の方法(後編)
Webサイトの分析と改善の方法(後編)Webサイトの分析と改善の方法(後編)
Webサイトの分析と改善の方法(後編)
 
『アフィリエイト・プログラムに関する意識調査2013』
『アフィリエイト・プログラムに関する意識調査2013』『アフィリエイト・プログラムに関する意識調査2013』
『アフィリエイト・プログラムに関する意識調査2013』
 
SEO対策に頼らないコンテンツマーケティング
SEO対策に頼らないコンテンツマーケティングSEO対策に頼らないコンテンツマーケティング
SEO対策に頼らないコンテンツマーケティング
 
ネット広告のシステム関連の話
ネット広告のシステム関連の話ネット広告のシステム関連の話
ネット広告のシステム関連の話
 
コミュニティ活動で幸せになろう
コミュニティ活動で幸せになろうコミュニティ活動で幸せになろう
コミュニティ活動で幸せになろう
 
「実践的」カスタマージャーニー分析のすすめ
「実践的」カスタマージャーニー分析のすすめ「実践的」カスタマージャーニー分析のすすめ
「実践的」カスタマージャーニー分析のすすめ
 
20160225 interspace system_summary
20160225 interspace system_summary20160225 interspace system_summary
20160225 interspace system_summary
 
Retty recommendation project
Retty recommendation projectRetty recommendation project
Retty recommendation project
 
これから機械学習エンジニアとして戦っていくみなさんへ ~MLOps というマインドセットについて~
これから機械学習エンジニアとして戦っていくみなさんへ ~MLOps というマインドセットについて~これから機械学習エンジニアとして戦っていくみなさんへ ~MLOps というマインドセットについて~
これから機械学習エンジニアとして戦っていくみなさんへ ~MLOps というマインドセットについて~
 
CHK-009_マイクロサービス アーキテクチャのすゝめ ~エンタープライズ システムを分割リリースせよ!!~
CHK-009_マイクロサービス アーキテクチャのすゝめ ~エンタープライズ システムを分割リリースせよ!!~CHK-009_マイクロサービス アーキテクチャのすゝめ ~エンタープライズ システムを分割リリースせよ!!~
CHK-009_マイクロサービス アーキテクチャのすゝめ ~エンタープライズ システムを分割リリースせよ!!~
 
アドネットワークのデータ解析チームを支える技術
アドネットワークのデータ解析チームを支える技術アドネットワークのデータ解析チームを支える技術
アドネットワークのデータ解析チームを支える技術
 
Minitabへようこそ 製造向け
Minitabへようこそ 製造向けMinitabへようこそ 製造向け
Minitabへようこそ 製造向け
 
Cloud DatalabとBigQueryを使ったアドホックデータ解析
Cloud DatalabとBigQueryを使ったアドホックデータ解析Cloud DatalabとBigQueryを使ったアドホックデータ解析
Cloud DatalabとBigQueryを使ったアドホックデータ解析
 
Webマーケティングサポート案内書
Webマーケティングサポート案内書 Webマーケティングサポート案内書
Webマーケティングサポート案内書
 
ユーザテストと定量分析ツールの併用方法
ユーザテストと定量分析ツールの併用方法ユーザテストと定量分析ツールの併用方法
ユーザテストと定量分析ツールの併用方法
 
微博&微信マーケティング
微博&微信マーケティング微博&微信マーケティング
微博&微信マーケティング
 
Tokyowebmining ctr-predict
Tokyowebmining ctr-predictTokyowebmining ctr-predict
Tokyowebmining ctr-predict
 

Ameba広告の配信制御アーキテクチャを刷新した話 ~オレシカナイトvol.3~