Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Ameba広告の配信制御を刷新した話
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
ykoma
April 18, 2023
Technology
310
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Ameba広告の配信制御を刷新した話
ykoma
April 18, 2023
More Decks by ykoma
See All by ykoma
ネット被害に遭わないための IDパスワード管理 / Manage IDs and passwords to avoid internet fraud
euno7
0
260
EKSクラスタをいい感じに作ろうとしたら令和になった話(前編) / We tried to build EKS cluster nicely
euno7
6
1.4k
SIerとインターネット企業のエンジニアの仕事 / Comparing work of engineer between SIer and Internet company
euno7
0
560
奥深きキャッシュの世界 / The world of profound cache
euno7
4
1.1k
Other Decks in Technology
See All in Technology
Databricks 月刊サービスアップデート 2026年05月号
tyosi1212
0
210
ルールやカスタム機能、どう使う?理想の出力を引き出すために今知りたいIBM Bob 5つの機能
muehara
1
340
PHP と TypeScript の型システム比較:AI 時代の「型」は誰のためにあるのか? #frontend_phpcon_do / frontend_phpcon_do_2026
shogogg
1
260
個人の発見を、組織の知恵に 〜生成AI活用を"探索"から"組織の仕組み"へ〜
kintotechdev
2
1k
新規ゲーム開発におけるAI駆動開発のリアル
202409e2
0
2.7k
サイバーセキュリティ概論 / Introduction to Cybersecurity
ks91
PRO
0
170
GoとSIMDとWasmの今。
askua
3
510
正解のないAIプロダクトをどう導くか?dodaが挑む、ユーザーの『本音』を構造化する評価設計と検証のリアル
techtekt
PRO
0
190
Agentic ERPをどう設計するか ー 受発注エージェントを動かす、現場の知見と設計思想ー
recerqainc
1
1.7k
価格.comをAI駆動で全面刷新する ー 30年分の技術的負債を返し、次の30年の土台をつくる ー / AI Engineering Summit Tokyo 2026
tkyowa
50
54k
運用を見据えたAIエージェント設計実践
amacbee
1
3.1k
Cloud Run のアップデート 触ってみる&紹介
gre212
0
320
Featured
See All Featured
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
350
Embracing the Ebb and Flow
colly
88
5.1k
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
0
1.6k
Designing Powerful Visuals for Engaging Learning
tmiket
1
400
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.3k
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
150
The Illustrated Children's Guide to Kubernetes
chrisshort
51
52k
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
360
Joys of Absence: A Defence of Solitary Play
codingconduct
1
390
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
140
The Pragmatic Product Professional
lauravandoore
37
7.3k
Transcript
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広告の配信制御 アーキテクチャを刷新 した話
配信制御?
ネット広告配信の流れ
None
ここに相当
作成しているデータ1 • 静的なデータ(マスタデータなど) • 広告枠などの配信面の情報 • どのフォーマットの広告を何個返すか • 配信したくないNG業種や広告主 •
出稿側の情報 • 広告主、広告キャンペーン、配信先プレースメント、入札情報など • 広告のクリエイティブ情報(画像、テキスト、動画など) etc…
作成しているデータ2 • 動的なデータ • 広告枠ごとに対する配信候補のインデック スなど (様々な条件で時々刻々と変わる)
当初のアーキテクチャ
None
ִؒ ॳ Ͱ ઃఆ%#ͷ༗ޮͳσʔλͷ શྔநग़ ৴ʹదͨ͠ܗͷՃ Ωϟογϡαʔόͷ 165
όοναʔό͕࡞ͨ͠ ΩϟογϡσʔλΛ ੈผʹอ࣋
ఆظతʹ࠷৽ੈͷϙʔϦϯά ੈ͕ߋ৽͞ΕͨΒ Ωϟογϡαʔόͷ σʔλΛٵ্͍͛ ΦϯϝϞϦͰอ࣋
良いところ • シンプルな構成でランニングコストが低い • オンメモリで必要な全データをキャッシュするため低レイテンシ • RDBと配信が切り離されているため、RDBがボトルネックになる 心配がない • RDB側のスキーマ変更等による配信への影響もない
• キャッシュ作成時に問題が起きても、次の世代の処理が成功すれば 大丈夫、という安心感
ちなみに この仕組みについて2016年に弊社公式エンジニ アブログで執筆したのでそちらもぜひご一読を https://ameblo.jp/principia-ca/entry-12145898865.html ࣌ʮ"+"ʯͱ͍͏ ϒϥϯυ໊Ͱͬͯ·͠ ͕ͨɺ͍Ζ͍Ζ͋ͬͯݱ ࡏʮ"NFCB*OGFFEʯ ͱ͍͏໊લͰͬͯ·͢
運用を続けるうちに 課題が顕在化
データ量の増加
Ϗδωε֦େʹͬͯ σʔλྔ͕૿େ
ॲཧ͕࣌ؒ͘ͳΓ ִؒͷόον͕ ͰऴΘΒͳ͘ͳΔ ୯ҰαʔόͷͨΊ εέʔϧͰ͖ͳ͍
σʔλྔ૿େʹΑΓ ༰ྔΛṧഭ εέʔϧΞοϓͰ͙྇ ʑ
σʔλྔ૿େʹΑΓ ϝϞϦṧഭͰ($ίετ૿େ ٵ্͍͛ʹ͕࣌ؒ ͔͔ΔΑ͏ʹ
結果
当初3分間隔だったバッチ ↓ 10分間隔に
バッチ間隔が延びると・・・ • 配信設定の追加/変更や、ON/OFFなどが なかなか配信に反映されない • 予算切れになってもなかなか配信が止ま らない
アーキテクチャレベルで 刷新することを決断
アーキテクチャレベルで 刷新することを決断 ͜ͷ࣌Ͱ͜Μͳʹେมͩ ͱߟ͍͑ͯͳ͔ͬͨɾɾɾ
刷新の方針(状態目標) • DBでのデータ更新から配信への反映は当初と同じ3 分以内を目標 • スケールしないポイントを作らない • 全データアドサーバ上でのオンメモリにはこだわら ない •
ただしレイテンシの悪化は許容範囲内に抑える
それを踏まえた実装方針1 • 配信設定のデータソースはRDBのまま • データソースまで変えると改修範囲がシステム のほぼ全域に及んでしまう • オンラインでの既存データの移行が現実的でな い •
配信時にRDBを直接参照しない点は踏襲
それを踏まえた実装方針2 • 世代ごとに毎回全量を作成する方式をやめる • 静的なデータは随時差分更新に (時間あたりの更新対象は少ない) • 動的なデータは一定間隔で全量更新 (時間あたりの更新対象は多い) •
アドサーバがキャッシュサーバを直接参照する方式から 、APIで配信データを提供する方式に
刷新版アーキテクチャ (ver.1)
None
3%#͜Ε·ͰΑΓ ߴ͍ฒྻͷΫΤϦΛࡹͨ͘Ίɺ 3FBE3FQMJDBΛཱͯͯ )"1SPYZ &-#Ͱෛՙࢄ ۤ͜͜ͷࡦɾɾɾ
Ωϟογϡαʔόʹ ৴੍ޚʹඞཁͳ੩తσʔλɺ ಈతσʔλ͕֨ೲ͞ΕΔ ͜͜ʹσʔλ͕ೖΔ͜ͱ͕ ͻͱ·ͣͷΰʔϧ
৴੍ޚ"1*͕Ξυαʔό ͔ΒͷϦΫΤετʹର͠ ΩϟογϡαʔόΛࢀরͯ͠ ϨεϙϯεΛฦ͢
δϣϒεέδϡʔϥ͕ ΩϟογϡʹࡌͤΔ σʔλͷछྨͱநग़݅ ྫ͑࠷ऴߋ৽͕Ҏͷ Ωϟϯϖʔϯͱ͔ Λύϥϝʔλʹ"1*ίʔϧ
*%1BSUJUJPOFS "1*͕ࢦఆ͞Εͨ݅Ͱ %#ʹର͠ߋ৽ରͷσʔλͷ*%Λ औಘ͢ΔͨΊʹ4&-&$5ɻ औಘͨ͠*%͝ͱʹϝοηʔδΛ ࡞͠,JOFTJTʹྲྀ͢
4ZODISPOJ[FS8PSLFS͕ ,JOFTJT͔ΒϝοηʔδΛ औΓग़ͯ֘͠*%ʹର͢Δ ΩϟογϡσʔλΛ࡞ɻ Ωϟογϡαʔόʹ165
ポイント • 更新対象のデータ種別、条件を指定できるようにし、差分 更新を可能に • 現在の設定では最終更新から5分以内の条件で毎分起動 (エラー時のリトライも兼ねて) • IDの抽出と、それに対するキャッシュデータ生成とを分離 し、Kinesis
Streamで非同期化することで並列化しやすく した
Kinesis Stream • AWSのフルマネージドなデータストリーミングサービス • 複数のConsumerアプリケーションに出力できる • シャード数を調整することで、スループットに応じたス ケーリングが設定できる •
KCLというConsumer用のクライアントライブラリが提 供されている
結果
None
ボツ
問題点1 • 並列度を上げた結果、RDBのレイヤーでRead Replica + HAProxyでもスループットが上がら ず、性能要件を満たせない • ある程度以上更新データが混み合うと急激 にスローダウンする
問題点2 • Kinesis Stream(KCL?)の特性上、シャードと クライアントとが1:1に紐づいてしまう • 特定のクライアントノードでスローダウンが 発生したときに他のノードで補い合えない • 遅いクライアントが掴んでいるシャードに入
ったメッセージがどんどん遅れてしまう
問題点2 - 図解
問題点2 - 図解
問題点2 - 図解 4IBSEʹೖͬͨϝοηʔδ͚ͩ ͲΜͲΜө͕Ε͍ͯ͘
刷新後アーキテクチャ (ver.2)
None
None
RDBをMySQLから Amazon Auroraに • AuroraはAWSが提供するMySQL互換のハイ パフォーマンス、高可用なDBエンジン • 元のMySQLと比較して、同じ構成でのスルー プットが大きく改善して一気に解決 •
アプリケーションには(既存のものも含めて) 一切手を入れなくてもよかった (素晴らしい)
RDBをMySQLから Amazon Auroraに • AWSが提供するMySQL互換のハイパフォー マンス、高可用なDBエンジン • 元のMySQLと比較して、同じ構成でのスルー プットが大きく改善して一気に解決 •
アプリケーションには(既存のものも含めて) 一切手を入れなくてもよかった (素晴らしい) 3%4Ͱͷ.Z42-ˠ "VSPSBҠߦΓ·ͨ͠ ɻ ڵຯ͋Δํ࠙ձͰ ͔ͭ·͍͑ͯͩ͘͞
非同期化部分をKinesis Stream からSQSに • SQSはAWSが提供するフルマネージド なメッセージキューイングサービス • リソースの空いているコンシューマア プリケーションがSQSにメッセージを 取りに行くため、特定のデータが遅延
していくという心配がなく、均一に
結果
None
ボツ 惜しい
問題点 • 静的なデータの更新量が多い状況下では Synchronizer Workerが混み合い、更新対象の 多い動的なデータの定期的な更新が追いつか ない • それでも更新要求は一定間隔で送り続けるた め、ジョブがどんどん溜まってしまう
刷新後アーキテクチャ (ver.3)
None
None
ver.2からの変更点 • Synchronizer Workerの後ろにさらにもう一段SQSと Worker(Indexer)を設け、動的なデータ(定期的に全量を洗い直すデ ータ)はそちらに流すようにした • Indexerは広告枠が生きている限り、インデックスデータを作成し たらまたIndexer用SQSにキューイングし、ループすることで繰り 返し処理を行う
• Indexer用のSQSには30秒の遅延キューの設定を入れた (30秒+αの時間間隔で動的データが更新される)
解決! • SQSの遅延キューの仕組みを利用し、動的デ ータが静的データの影響を受けずに一定間隔 (30秒+α)でデータがリフレッシュされる仕組 みが実現できた
None
結果
無事リリース
配信制御のリプレース 無事完了
目的は達成できたのか • DBでのデータ更新から配信への反映は当初と同じ3 分以内を目標 • スケールしないポイントを作らない • 全データアドサーバ上でのオンメモリにはこだわら ない •
ただしレイテンシの悪化は許容範囲内に抑える
• DBでのデータ更新から配信への反映は当初と同じ3 分以内を目標 • スケールしないポイントを作らない • 全データアドサーバ上でのオンメモリにはこだわら ない • ただしレイテンシの悪化は許容範囲内に抑える
目的は達成できたのか σʔλͷߋ৽ྔʹΑΓ্Լ͢Δ͕ ֓ͶҎͰө
• DBでのデータ更新から配信への反映は当初と同じ3 分以内を目標 • スケールしないポイントを作らない • 全データアドサーバ上でのオンメモリにはこだわら ない • ただしレイテンシの悪化は許容範囲内に抑える
目的は達成できたのか %#ɺΩϟογϡͱΑΓɺ֤Ϟ δϡʔϧ͕ࢄฒྻॲཧͰ͖ΔΑ ͏ʹͳͬͨͨΊɺεέʔϧΞτ ʹΑΔεέʔϦϯά͕Մೳʹ
目的は達成できたのか • DBでのデータ更新から配信への反映は当初と同じ3 分以内を目標 • スケールしないポイントを作らない • 全データアドサーバ上でのオンメモリにはこだわら ない •
ただしレイテンシの悪化は許容範囲内に抑える ฏۉϨΠςϯγ NTˠNT ͳΜͱ͔ڐ༰ൣғͱࢥ͑Δൣғʹ ͑Δ͜ͱ͕Ͱ͖ͨ
リリース後
2017年8月に完全移行 • 配信制御API • ピーク時70000qps程度 • レイテンシ3~4ms前後 • 配信への反映 •
概ね2分以内を維持
今後の課題 • 配信制御APIのレスポンスをもう少し速くしたい • 1回の配信で何度も叩かれるAPIなので、1msの改善が全体では大 きくレイテンシの改善につながる • DSP(=Demand Side Platform)などレイテンシ要件が厳しいもの
にも不安なく使えるようにしたい • インフラコストの削減 • システムが複雑化した分、インフラコストは膨らんでしまった
ご清聴ありがとうございました