SlideShare une entreprise Scribd logo
1  sur  33
Télécharger pour lire hors ligne
インターネット広告の
概要とシステム設計
株式会社マイクロアド
松宮 康二 (まっつー)
エンジニア夏オンライン勉強会
自己紹介
● 名前: 松宮 康二(まっつー)
● 役職: シニアエンジニア DSP担当
● 最近触ってるもの
● 最近の趣味: キャンプ
● ちょっと前の趣味: ラーメン作り
● Twitter: @mattsu6666
2
もくじ
● インターネット広告とは
○ インターネット広告の市場規模
○ ターゲティング広告
○ DSP/SSPへの変遷
○ 広告の指標
○ 広告の品質維持
○ プライバシーの問題
● 広告配信システムの宿命
○ 100msの制約
○ 1つのエンドポイントに全ての機能が詰まっている
○ 増え続ける広告在庫
○ 増え続けるリクエスト
○ まとめると
○ 業務課題に対するアプローチとキーワード
● なぜScala, DDD, Akkaなのか
○ Scala
○ なぜScalaなのか
○ 関数型言語はなぜシンプルなのか
○ ポリモーフィズムが重要な理由
○ DDD
○ ドメインモデルをピュアにすべきな理由
○ 巨大なモノリシックなアプリのメンテナビリティ
○ Akka
○ アクターモデル
○ スループットではなくレイテンシを高める
○ なぜScala, DDD, Akkaなのか
● まとめ
3
4
インターネット広告とは
インターネット広告の市場規模
● 2019年、初めてインターネット広告費が2兆円超えでテレビメディア広告費を抜く
● 8年連続のプラス成長
● 総広告費は6兆6,514億円なので、約30%がインターネット広告費
5
引用: https://www.dentsu.co.jp/news/release/pdf-cms/2020014-0311.pdf
ターゲティング広告
● インターネット広告の始まりは(日本だと)1996年頃
● 最初はHTMLに直接広告を埋め込んでいた
● アドサーバの登場によって、動的に広告が表示できるようになる
● 会員制のWebサイトなら利用者の登録属性、IP、時間帯等に応じて広告を出し分けられる (ターゲティン
グ広告)
● 具体的には下記のターゲティングが可能 (マイクロアドで利用可能な機能のみ掲載)
○ デバイスターゲティング
○ プレースメントターゲティング
○ オーディエンスターゲティング
○ ロケーションターゲティング
○ タイムターゲティング
6
Webページ
広告
Webページ
広告Webサーバ
アドサーバ
Webサーバ
Cookie、IP、時間等を利用してユーザに
適切な広告を配信
予約しておいた広告を配信
アドサーバ以前 アドサーバ以降
DSP/SSPへの変遷
● 最初の頃、広告主はメディアや広告枠を選定して購入する必要があった (純広告)
● また、メディアは広告在庫が売れ残るリスクがあった
● そこで、複数メディアの広告枠をまとめて販売するアドネットワークが登場
● しかし広告主、メディア双方にとってデメリットがあった
○ 広告主: 掲載面を選べないので、出したくないメディアにも広告が出る
○ メディア: 適正な価格で取引できない
● そこで、オープンな取引市場の役割を持ったアドエクスチェンジが登場
● アドエクスチェンジを構成するツールがDSP (Demand Side Platform), SSP (Supply Side Platform)
● だったが、RTBが主流になり、DSP/SSPが直接繋がるようになる
7
Webページ
広告
Webページ
広告
Webページ
広告
アドネットワーク 広告主
広告枠をまとめて購入
アドエクスチェンジ DSPSSP
買いたい価格で買う
売りたい価格で売る
オークション方式で取引
SSPDSP
RTB (Real Time Bidding)
DSP
DSP
SSP
SSP
SSPとDSP同士が相互に繋がる
アドネットワーク アドエクスチェンジ DSP/SSP
広告の指標
● 広告は様々な指標を使って効果を測定している
● 代表的な指標
○ インプレッション数: 広告を表示した回数
○ ビューアブルインプレッション数: 広告を表示して、ユーザが実際に見た回数
○ クリック数: 広告をクリックした回数
○ コンバージョン数: 商品の購入、サブスク、資料請求、アプリインストール、会員登録等の行動
○ インプレッション単価 (CPM: Cost per Mille): 1000回あたりのインプレッション単価
○ クリック率 (CTR: Click Through Rate): インプレッションのうちクリックした率
○ クリック単価 (CPC: Cost per Click): 1クリックあたりの単価
○ コンバージョン率 (CVR: Conversion Rate): クリックしてコンバージョンまで行った率
○ コンバージョン単価 (CPA: Cost per Acquisition): コンバージョンあたりの単価
8
CTR低いですね。目標CPCを引き上げて様子見てみましょう。
インプレッションは出てますが、ビューアブルインプレッションは全く計測されませんね。
アドフラウド(広告詐欺)かも知れません。
予算10万円で100CPMなので100万インプレッションですね。ブランディング目的としてはい
い調子です。
利用例
運用担当
開発担当
営業担当
広告の品質維持
● 昨今、不適切なメディアへの配信によるブランド毀損の懸念があり、ブランドセーフティが注目される
○ 漫画村、Anitube等の違法サイトに広告を掲載していた広告代理店等が炎上
● インターネット広告の仕組みを悪用したアドフラウド(広告詐欺)が問題になっている
○ これも漫画村で使われていたので、注目が集まった
9
アドベリフィケーションの重要性が増す
DSP DB
ブランドセーフティ
API
アドフラウドAPI
URL/IPで問い合わせ
定期的にDBを更新
アドベリ関連のソリューションを提供している会社例
DSPによるアドベリの活用
プライバシーの問題
● ターゲティング広告ではユーザのトラッキングが重要
● しかし、世の流れ的にはターゲティング広告は規制の対象になり始めている
● EUでは一般データ保護規則(GDPR)が2018年5月に施行
○ 日本の企業でも欧州圏のユーザをトラッキングすると罰則
○ 加えて、eプライバシー規則が新たに審議されている
● SafariではITP(Intelligent Tracking Prevention)によってサードパーティクッキーをブロック
● Googleが推進するPrivacy Sandboxによってクッキーの代替案が提案
● 改正個人情報保護法が2020年6月に成立。2022年6月までに施行予定
○ ユーザのトラッキングに同意が必要になる
● 今後は「プライバシーテック」が流行るような気がしている (個人的見解)
10
Webページ
計測
タグ
Webページ
計測
タグ
計測
サーバ
Webページを横断して計測
(Cookieを利用)
DSPDB
永続化 RTB時に参照
Cookieを利用した
トラッキング
ここまでは一般的なインターネット広告のお話でした。
続いて、自分が担当しているDSPの技術的な部分を見ていきます。
11
12
広告配信システムの宿命
100msの制約
● SSPがDSPへ入札要求をしてから100ms以内に返却することが必須条件
● 100msを超えた場合はタイムアウトで入札が拒否される
● レイテンシを含む時間なので現実的には遅くても30ms程度で処理する
● 入札できない = 落札されない = 売上を生まない = 倒産
13
100msの制約を守ることは業務が成立する必要条件
SSP
DSP A
DSP B
DSP C
WEBページ
広告枠
入札要求
100ms以内に応答しないとタイムアウト
応札(50ms)
広告をリクエスト
広告をレスポンス
応札(100ms)
応札(150ms)
入札要求
入札要求
50msで応答してい
るので入札成功
100msで応答して
いるので入札成功
150msで応答して
いるので入札失敗
1つのエンドポイントに全ての機能が詰まっている
● 一般的なWebアプリ等と異なり、エンドポイントはSSP毎に1つだけ
○ 設計次第だがマイクロアドではSSP毎にエンドポイントを分けている
○ 1つのAPIに対して機能追加し続けるイメージ
● ビジネスのスケールとともに機能は増え続ける
● 機能が増えても100msの制約は不変
● しかし機能追加は避けては通れない
14
機能追加は業務を継続する必要条件
SSP A
DSP
入札要求
POST /rtb/a
SSP B
入札要求
POST /rtb/b
SSP C
入札要求
POST /rtb/c
位置情報を使う機能
ユーザの性別とか判定する機能
ユーザと似たユーザを検索する機能
行動履歴を使う機能
ブラックリストユーザ判定機能
ヽ(・ω・ヽ*) PDM
オフライン購買データを使う機能
新機能追加して!
RTBの内部処理
・・・
機能追加をすればする程、RTBの内部処理は
複雑かつ高負荷になっていく。
増え続ける広告在庫
● ビジネスのスケールとともに扱う広告在庫は増大 ※広告在庫とは広告の表示可能回数のこと
● 1度のRTBで出来るだけ多くの広告を配信対象にしたい
● 多くの広告在庫を扱える = より精度の高い広告を配信可能 = 高い広告効果
○ また、たくさん表示可能なため単純に売上が伸びる
● 一方で扱う広告の増大は処理負荷の増大に直結
● 少なくても業務は成り立つけど、スケールしない
15
多くの広告在庫を扱えることは業務が成立する十分条件
SSP DSP
入札要求
応札
化粧品関連のページから
リクエスト
うーん・・・とりあえず健
康関連? DSP 化粧品が最適!(略)
入札要求
応札
DSP(略)
入札要求
応札
(タイムアウト)
化粧品
関連
健康
関連
旅行
関連
広告在庫
健康
関連
旅行
関連
広告在庫
旅行
関連
健康
関連
化粧品
関連
広告在庫
・・・
お、おおすぎる!
処理が間に合わねぇ
広告在庫が少ないと・・・ 広告在庫が多いと 広告在庫が多過ぎると
処理が間に合わず機会損失が発生するのは
もったいない!
こうならないようにエンジニアが頑張る
増え続けるリクエスト
● ビジネスのスケールとともに受けるリクエストは増大
● 出来る限り多くのリクエストを受けたい
● 大量のリクエスト = 入札機会の増大 = 売上アップ
● 大量のリクエストを捌きたいなら・・・
○ サーバを増やす
○ サーバのスペックを上げる
● しかし・・
○ サーバは高い(1台辺り10~20万)
○ ラックに限りがある
○ 1台辺りの収益率が落ちるのは本末転倒
● よって、富豪的アプローチで万事解決とは行かない
● ハードに頼り切るのではなく、ソフトウェアも限界までチューニング
16
大量のリクエストが捌けることは業務が成立する十分条件
日毎のリクエスト数 ※軸の値は伏せてます
増加傾向にある
まとめると
● 100msの制約を守ることは業務が成立する必要条件
● 機能追加は業務を継続する必要条件
● 多くの広告在庫を扱えることは業務が成立する十分条件
● 大量のリクエストが捌けることは業務が成立する十分条件
17
このようなアドテク特有の課題をどうやってクリアするか?
100msの制約
機能追加
多くの広告在庫を扱える 大量のリクエストが捌ける
業務
業務課題に対するアプローチとキーワード
● プログラミング言語にScalaを採用
○ 関数型プログラミング
○ オブジェクト指向プログラミング
○ JVM言語
● ソフトウェアの設計手法にドメイン駆動設計(DDD)を採用
○ 3層 + ドメインアーキテクチャ
○ ドメインモデル
○ ユビキタス言語
● 主要なフレームワーク・ツールキットにAkkaを採用
○ 並行並列処理
○ リアクティブシステム
○ アクターモデル
18
次のスライドから詳細な説明をしていきます
19
なぜScala, DDD, Akkaなのか
Scala
● JVM言語の1つ
● 静的型付け言語
○ 型推論・パターンマッチング
● 小規模なスクリプトから大規模システムの構築まで幅広く利用可能
○ Scalaはscalable languageに由来する
● すべてのJava製ライブラリと相互運用可能
● オブジェクト指向と関数型プログラミングの概念を持つ
● 充実したコレクションAPI
○ ループ処理ではなく述語関数によって表現
20
object Main extends App {
println("Hello world")
}
Seq(1,2,3,4,5)
.map(_ * 2)
.filter(_ > 5)
> Hello world
> Seq[Int] = List(6, 8, 10)
Hello worldの例 述語関数を使った例(for文を使わずにループ処理)
なぜScalaなのか
● 関数型言語の特徴を持っており、シンプルに記述できる
○ イミュータブル
○ 副作用を発生させづらい構文(例えばif文ではなくif式)
○ nullを発生させないデータ構造
● オブジェクト指向言語の特徴を持っており、DDDとの相性が良い
○ ポリモーフィズム(最も重要!) ※後述
○ カプセル化
○ 継承
● JVM言語の安心感
○ 十分な実績を持つJavaとの互換性
○ JVM上で動作するため、Javaに近い性能を期待できる
○ コンパイル言語なので、型安全による安心感
21
関数型言語はなぜシンプルなのか
● 関数型プログラミングは純粋関数だけを使う
○ 純粋関数とは副作用がない関数
● 副作用とは関数内で副次的に発生するアクション
○ グローバル変数に再代入する
○ データベースを参照・更新する
○ I/O
○ 例外を投げる等
● 純粋関数は入力に対して必ず同じ出力がある
● システムの状態に依存しないので...
○ 頭の中で状態を追いながら読まなく良い
○ テストコードが書きやすい
22
class Auth {
public void auth(Token token) {
token.set(getAuth())
}
}
副作用があるケース(コードはJava)
class Auth {
def auth(token: Token): Token = {
token.copy(getAuth())
}
}
副作用がないケース
返り値(結果型)がvoidかTokenの違いがある
副作用があるケースは「 tokenを更新」
副作用がないケースは「 tokenを新規作成」
ポリモーフィズムが重要な理由
● ポリモーフィズム(多態性)はインタフェースに実装できる性質
○ オブジェクト指向以前もポリモーフィズムは可能だったが、言語レベルで安全に実装できるようになった (だからこそ重要)
● インタフェースによってプログラムをより抽象的・汎用的に記述できる
○ 例えばUNIXのIOデバイスドライバはopen, close, read, write, seekの標準機能を提供する
○ もしインタフェースが統一されていなかったら、デバイス依存のコードになり用途が限られる
● インタフェース同士が依存し合うことで高いモジュール性・疎結合性を得る
● ポリモーフィズムによって、ソースコードの依存関係を絶対的に制御(※後述)
23
モジュール同士が抽象に依存
具象クラスを自由に付け替えられる => 疎結合
UNIXはデータの入出力をファイルとして扱う => デバイス非依存
DDD
● DDD(ドメイン駆動設計)はソフトウェア設計手法のこと
○ 技術では無く、ドメイン知識(業務知識)を中心に考える
● 事業価値を最大化することが我々の究極の目標
● しかし実際には...
○ ドメインエキスパート(PDMなどドメインに詳しい人)は事業価値の向上に注力
○ エンジニアは業務上の問題を技術的に解決しようとする
○ エンジニアによって翻訳されたソフトウェアになってしまう
○ 両者のコミュニケーションの相違が起こってしまう
● DDDはドメインエキスパートとエンジニアが共通認識(ユビキタス言語)を
持ったソフトウェアを作る(コードがドメインモデルを反映)
24
(・ω・*) PDM
「広告」には「画像」とか「動画」とかの種類があるんだよ
なぁ。
「広告主」がどっちか選んで「 登録」するんだよねぇ
エンジニア (,,゚Д゚)
画像とか動画とかいってもフォーマット色々あるし、「 JPEG
広告」「PNG広告」「MP4広告」みたいな感じで実装すっか。
生成ロジックを統一したいし、「 ユーザ」が「広告ジェネレー
タ」を使って「生成」するようにしよっと。
下の会話では両者が違う言葉を使っている。
この状況が続くと、両者の認識のズレは拡大し、いつかプロ
グラムの修正が困難な状況に陥る可能性が高い
ドメインモデルをピュアにすべきな理由
● ドメインモデルは何にも依存させるべきではない(ピュアにすべき)
● さらに、ビジネスルールは技術的関心事に左右されるべきではない
● ビジネスルールとはドメインモデルの構成要素
○ "Business rules describe the operations, definitions and constraints that apply to an organization. Business rules can apply to people,
processes, corporate behavior and computing systems in an organization, and are put in place to help the organization achieve its goals."
○ つまり、ビジネス活動の中で意思決定を行うための規則
○ 個人的には、コンピュータが消滅しても失われないルールのことだと思ってる
○ 僕らが一番守りたいのはビジネスルール
25
※広告の例だと
分かりづらかっ
たので
お店を例にしま
した
ECサイト ~インターネット時代~商品を買う例
お店 ~近代~ お店 ~昔~
● 合計の求め方
● 小計の求め方
● 消費税の求め方
などは「会計システム」「POSシステ
ム」「そろばん」(技術的関心事)に左
右されるべきじゃない!
引用: https://en.wikipedia.org/wiki/Business_rule
巨大なモノリシックなアプリのメンテナビリティ
● 広告配信システムは非機能要件的にどうしてもモノリシックな一枚岩に
● 一枚岩故にドメインはめちゃくちゃ複雑
● 一枚岩なのに色んなシステムと接続しまくる
● 何も考えずに作ったらメンテナビリティは容易に悪化
● DDDを取り入れ多層アーキテクチャによってドメインモデルを保護
● レイヤーの依存関係を厳格にし、影響範囲の局所化と明確化
26
プレゼンテーション層
データソース層
アプリケーション層 ドメイン層
A
B
AはBに依存している
HTTPやRPCなどの入力の
インタフェースを担当
ユースケースを担当
(ビジネスロジック)
DB接続周り担当
ビジネスルール担当
(ドメインモデル)
Akka
● Scala製の並行並列処理に特化したツールキット(フレームワークとライブラリを合わせたやつ)
● 主にLightbend社によって開発・メンテされているOSS
● 並行並列、分散システムを簡単に記述するためにアクターモデルを提供
○ アクターモデル自体は1973年に登場
○ クラウドコンピューティングの進歩とムーアの法則の終焉などでスケールアウトが主流になってきたことで
再び注目を浴びてきた
● アクター以外にAkka Streams, Akka Clustring, Akka HTTP等様々なコンポーネントを提供している
● Akkaはリアクティブ宣言に基づいて設計されている
○ 「リソースを効率よく利用し、アプリケーションをを自動的にスケールできるようにすること」 (Akka実践バイブルより引用)
27
引用: https://www.reactivemanifesto.org/ja
アクターモデル
● アクターはメッセージ駆動の計算実体(スレッドに似ている)
○ アクターは非同期に実行される
● アクター同士(数千・数百万)が協調して1つのアプリケーションを構成する
● アトミックやロックを使わず、安全に並行並列処理が実装できる
○ アクターはメールボックス(メッセージキューみたいな)を持っていて、1度に1つ処理
● アクターはfire-and-forget(撃ちっぱなし)の性質によって、非同期処理を実現している
● スケーラビリティのためにアクター同士は疎結合になっている
○ 空間/位置: 位置透過性とも。同じノード、異なるノード等、どこにアクターがいても良い
○ 時間: アクターはタスクの完了について何も保証しないし、期待もしない
○ インターフェース: アクター同士は何も共有しない。インタフェースが正しいかとか関係ない
28
Actor
Actor
Actor
メッセージ送信
メッセージ送信
メッセージ送信
アクターシステム
メールボックス
(メッセージキュー)
アクターは非同期で動作するのでア
クターの数だけ並行並列に動作可
能
ロックとかアトミックな操作は一切不
要
メッセージを受信し
て何か処理
スループットではなくレイテンシを高める
● アクターモデルによって、並行並列処理が安全に実装可能
● スレッドでは実現出来なかったスケールアウトも可能
● アクターによって処理を細かい単位で分離するので、局所的にスケール可能
● よって、Akkaを採用することにした
● しかし・・・良いことばかりではない
○ 高い学習コスト
○ アプリケーションの性質上、コアなロジックはアクターによるスケールアウトが難しい(通信コストが無視出来ない)
○ まだ発展途上のOSSのため、バージョン上がるとガッツリAPIが変わってる
● スループットは変わらないが、レイテンシは高めたい(アクターモデルの恩恵を享受)
○ 全体をそれなりに早くではなく、1リクエスト辺りの応答速度を高めたい
○ 大量のリクエストを満遍なくタイムアウトさせるより、少量のリクエストを確実に返せた方が良い
○ そのためにはアクターモデルを活用した並行並列処理が使いやすい
29
リクエスト1の処理
リクエスト2の処理
リクエスト1の処
理
リクエスト1の処
理
リクエスト2の処
理
リクエスト2の処
理
スレッド1
スレッド2
200ms
スレッド1
スレッド2
200ms
200msでどちらも2件のリクエストを
捌いた。
しかし、左は200msかかってしまっ
てタイムアウトになった
一方で右は100msで応答したので
入札できた
広告配信システムでは100msの制
約があるのでタイムアウト!
超理想の話なので実際にはこんな
綺麗に並列化は難しい
なぜScala, DDD, Akkaなのか
● Scala
○ オブジェクト指向、関数型のメリットを享受できる
○ JVM上で動作するので性能面での安心感
○ 強力な型システムによって規模の拡大が原因でメンテナビリティが低下しづらい等
● DDD
○ 複雑なドメインに立ち向かう手段
○ ビジネスルールに集中でき、事業価値を高めやすい
○ Scalaと相性が良い(オブジェクト指向との相性が良い)
● Akka
○ 並行並列処理、分散処理を安全に実装できる
○ 様々な便利なコンポーネントが使える
30
まとめ
● インターネット広告の概要について話した
○ 市場規模は2019年に2兆を超え、益々注目を浴びている
○ DSP/SSPが登場し、ターゲティング広告が主流になった
○ 広告の効果を測る、代表的な指標を紹介した
○ 近年は広告の品質やプライバシーの問題に注目が集まっている
● 広告配信システムが持つ特殊な要件を話した
○ 100msの絶対的な制約があり、それを満たしたシステム設計を求められる
● 広告配信システムを実現するために使用した技術の説明をした
○ Scala, DDD, Akkaを取り上げ、システム設計の一部を紹介した
○ Scalaは関数型、オブジェクト指向型であり、大規模な開発に耐えうる言語であった
○ DDDを導入することで、複雑な仕様のシステムにおけるメンテナビリティの向上に努めている
○ Akkaを利用することで、コアなロジックを簡潔に保つような設計にしている
31
We Are Hiring!!
32
マイクロアドでは、広告配信システムを一緒に作りたい人を
募集しています!
https://recruit.microad.co.jp/
公式アカウント @microad_dev もよろしくお願いします。
参考文献
● 必携 インターネット広告
● Scalaスケーラブルプログラミング第3版
● Scala関数型デザイン&プログラミング―Scalazコントリビューターによる関
数型徹底ガイド
● Clean Architecture 達人に学ぶソフトウェアの構造と設計
● 実践ドメイン駆動設計
● Akka実践バイブル アクターモデルによる並行・分散システムの実現
● 現場で役立つシステム設計の原則 〜変更を楽で安全にするオブジェクト指向
の実践技法
33

Contenu connexe

Tendances

アドテク勉強会
アドテク勉強会アドテク勉強会
アドテク勉強会Shoho Kozawa
 
アドテクに携わって培った アプリをハイパフォーマンスに保つ設計とコーディング
アドテクに携わって培った アプリをハイパフォーマンスに保つ設計とコーディング アドテクに携わって培った アプリをハイパフォーマンスに保つ設計とコーディング
アドテクに携わって培った アプリをハイパフォーマンスに保つ設計とコーディング MicroAd, Inc.(Engineer)
 
MagicOnion入門
MagicOnion入門MagicOnion入門
MagicOnion入門torisoup
 
新入社員のための大規模ゲーム開発入門 サーバサイド編
新入社員のための大規模ゲーム開発入門 サーバサイド編新入社員のための大規模ゲーム開発入門 サーバサイド編
新入社員のための大規模ゲーム開発入門 サーバサイド編infinite_loop
 
MLOpsの概要と初学者が気をつけたほうが良いこと
MLOpsの概要と初学者が気をつけたほうが良いことMLOpsの概要と初学者が気をつけたほうが良いこと
MLOpsの概要と初学者が気をつけたほうが良いことSho Tanaka
 
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織Takafumi ONAKA
 
ひと漕ぎで二度おいしい!? Flutterを使ったモバイルアプリ開発への期待と実態と付き合い方(NTTデータ テクノロジーカンファレンス 2020 発表資料)
ひと漕ぎで二度おいしい!? Flutterを使ったモバイルアプリ開発への期待と実態と付き合い方(NTTデータ テクノロジーカンファレンス 2020 発表資料)ひと漕ぎで二度おいしい!? Flutterを使ったモバイルアプリ開発への期待と実態と付き合い方(NTTデータ テクノロジーカンファレンス 2020 発表資料)
ひと漕ぎで二度おいしい!? Flutterを使ったモバイルアプリ開発への期待と実態と付き合い方(NTTデータ テクノロジーカンファレンス 2020 発表資料)NTT DATA Technology & Innovation
 
Elasticsearch の検索精度のチューニング 〜テストを作って高速かつ安全に〜
Elasticsearch の検索精度のチューニング 〜テストを作って高速かつ安全に〜Elasticsearch の検索精度のチューニング 〜テストを作って高速かつ安全に〜
Elasticsearch の検索精度のチューニング 〜テストを作って高速かつ安全に〜Takahiko Ito
 
なぜなにリアルタイムレンダリング
なぜなにリアルタイムレンダリングなぜなにリアルタイムレンダリング
なぜなにリアルタイムレンダリングSatoshi Kodaira
 
先駆者に学ぶ MLOpsの実際
先駆者に学ぶ MLOpsの実際先駆者に学ぶ MLOpsの実際
先駆者に学ぶ MLOpsの実際Tetsutaro Watanabe
 
Hadoopデータ基盤とMulti-CloudなML基盤への取り組みの紹介
Hadoopデータ基盤とMulti-CloudなML基盤への取り組みの紹介Hadoopデータ基盤とMulti-CloudなML基盤への取り組みの紹介
Hadoopデータ基盤とMulti-CloudなML基盤への取り組みの紹介MicroAd, Inc.(Engineer)
 
JVMパラメータチューニングにおけるOptunaの活用事例 ( Optuna Meetup #1 )
JVMパラメータチューニングにおけるOptunaの活用事例 ( Optuna Meetup #1 ) JVMパラメータチューニングにおけるOptunaの活用事例 ( Optuna Meetup #1 )
JVMパラメータチューニングにおけるOptunaの活用事例 ( Optuna Meetup #1 ) Hironobu Isoda
 
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Springドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring増田 亨
 
RustによるGPUプログラミング環境
RustによるGPUプログラミング環境RustによるGPUプログラミング環境
RustによるGPUプログラミング環境KiyotomoHiroyasu
 
Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現
Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現
Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現Yoshifumi Kawai
 
PHPで大規模ブラウザゲームを開発してわかったこと
PHPで大規模ブラウザゲームを開発してわかったことPHPで大規模ブラウザゲームを開発してわかったこと
PHPで大規模ブラウザゲームを開発してわかったことKentaro Matsui
 
脱RESTful API設計の提案
脱RESTful API設計の提案脱RESTful API設計の提案
脱RESTful API設計の提案樽八 仲川
 
がっつりMongoDB事例紹介
がっつりMongoDB事例紹介がっつりMongoDB事例紹介
がっつりMongoDB事例紹介Tetsutaro Watanabe
 

Tendances (20)

アドテク勉強会
アドテク勉強会アドテク勉強会
アドテク勉強会
 
Marp Tutorial
Marp TutorialMarp Tutorial
Marp Tutorial
 
アドテクに携わって培った アプリをハイパフォーマンスに保つ設計とコーディング
アドテクに携わって培った アプリをハイパフォーマンスに保つ設計とコーディング アドテクに携わって培った アプリをハイパフォーマンスに保つ設計とコーディング
アドテクに携わって培った アプリをハイパフォーマンスに保つ設計とコーディング
 
MagicOnion入門
MagicOnion入門MagicOnion入門
MagicOnion入門
 
新入社員のための大規模ゲーム開発入門 サーバサイド編
新入社員のための大規模ゲーム開発入門 サーバサイド編新入社員のための大規模ゲーム開発入門 サーバサイド編
新入社員のための大規模ゲーム開発入門 サーバサイド編
 
MLOpsの概要と初学者が気をつけたほうが良いこと
MLOpsの概要と初学者が気をつけたほうが良いことMLOpsの概要と初学者が気をつけたほうが良いこと
MLOpsの概要と初学者が気をつけたほうが良いこと
 
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
 
ひと漕ぎで二度おいしい!? Flutterを使ったモバイルアプリ開発への期待と実態と付き合い方(NTTデータ テクノロジーカンファレンス 2020 発表資料)
ひと漕ぎで二度おいしい!? Flutterを使ったモバイルアプリ開発への期待と実態と付き合い方(NTTデータ テクノロジーカンファレンス 2020 発表資料)ひと漕ぎで二度おいしい!? Flutterを使ったモバイルアプリ開発への期待と実態と付き合い方(NTTデータ テクノロジーカンファレンス 2020 発表資料)
ひと漕ぎで二度おいしい!? Flutterを使ったモバイルアプリ開発への期待と実態と付き合い方(NTTデータ テクノロジーカンファレンス 2020 発表資料)
 
Elasticsearch の検索精度のチューニング 〜テストを作って高速かつ安全に〜
Elasticsearch の検索精度のチューニング 〜テストを作って高速かつ安全に〜Elasticsearch の検索精度のチューニング 〜テストを作って高速かつ安全に〜
Elasticsearch の検索精度のチューニング 〜テストを作って高速かつ安全に〜
 
なぜなにリアルタイムレンダリング
なぜなにリアルタイムレンダリングなぜなにリアルタイムレンダリング
なぜなにリアルタイムレンダリング
 
先駆者に学ぶ MLOpsの実際
先駆者に学ぶ MLOpsの実際先駆者に学ぶ MLOpsの実際
先駆者に学ぶ MLOpsの実際
 
【Unity道場】使って覚えるTileMap
【Unity道場】使って覚えるTileMap【Unity道場】使って覚えるTileMap
【Unity道場】使って覚えるTileMap
 
Hadoopデータ基盤とMulti-CloudなML基盤への取り組みの紹介
Hadoopデータ基盤とMulti-CloudなML基盤への取り組みの紹介Hadoopデータ基盤とMulti-CloudなML基盤への取り組みの紹介
Hadoopデータ基盤とMulti-CloudなML基盤への取り組みの紹介
 
JVMパラメータチューニングにおけるOptunaの活用事例 ( Optuna Meetup #1 )
JVMパラメータチューニングにおけるOptunaの活用事例 ( Optuna Meetup #1 ) JVMパラメータチューニングにおけるOptunaの活用事例 ( Optuna Meetup #1 )
JVMパラメータチューニングにおけるOptunaの活用事例 ( Optuna Meetup #1 )
 
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Springドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
 
RustによるGPUプログラミング環境
RustによるGPUプログラミング環境RustによるGPUプログラミング環境
RustによるGPUプログラミング環境
 
Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現
Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現
Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現
 
PHPで大規模ブラウザゲームを開発してわかったこと
PHPで大規模ブラウザゲームを開発してわかったことPHPで大規模ブラウザゲームを開発してわかったこと
PHPで大規模ブラウザゲームを開発してわかったこと
 
脱RESTful API設計の提案
脱RESTful API設計の提案脱RESTful API設計の提案
脱RESTful API設計の提案
 
がっつりMongoDB事例紹介
がっつりMongoDB事例紹介がっつりMongoDB事例紹介
がっつりMongoDB事例紹介
 

Similaire à インターネット広告の概要とシステム設計

アドテクを支える技術 〜1日40億リクエストを捌くには〜
アドテクを支える技術 〜1日40億リクエストを捌くには〜アドテクを支える技術 〜1日40億リクエストを捌くには〜
アドテクを支える技術 〜1日40億リクエストを捌くには〜MicroAd, Inc.(Engineer)
 
クリスマスを支える俺たちとJava(JJUG CCC 2015 Spring AB4)
クリスマスを支える俺たちとJava(JJUG CCC 2015 Spring AB4)クリスマスを支える俺たちとJava(JJUG CCC 2015 Spring AB4)
クリスマスを支える俺たちとJava(JJUG CCC 2015 Spring AB4)Koichi Sakata
 
[db tech showcase Tokyo 2016] A25: ACIDトランザクションをサポートするエンタープライズ向けNoSQL Databas...
[db tech showcase Tokyo 2016] A25: ACIDトランザクションをサポートするエンタープライズ向けNoSQL Databas...[db tech showcase Tokyo 2016] A25: ACIDトランザクションをサポートするエンタープライズ向けNoSQL Databas...
[db tech showcase Tokyo 2016] A25: ACIDトランザクションをサポートするエンタープライズ向けNoSQL Databas...Insight Technology, Inc.
 
データ分析に必要なスキルをつけるためのツール~Jupyter notebook、r連携、機械学習からsparkまで~
データ分析に必要なスキルをつけるためのツール~Jupyter notebook、r連携、機械学習からsparkまで~データ分析に必要なスキルをつけるためのツール~Jupyter notebook、r連携、機械学習からsparkまで~
データ分析に必要なスキルをつけるためのツール~Jupyter notebook、r連携、機械学習からsparkまで~The Japan DataScientist Society
 
Kaggleのテクニック
KaggleのテクニックKaggleのテクニック
KaggleのテクニックYasunori Ozaki
 
MySQLで学ぶ機械学習ことはじめ.pdf
MySQLで学ぶ機械学習ことはじめ.pdfMySQLで学ぶ機械学習ことはじめ.pdf
MySQLで学ぶ機械学習ことはじめ.pdfMachiko Ikoma
 
GraphQLはどんな時に使うか
GraphQLはどんな時に使うかGraphQLはどんな時に使うか
GraphQLはどんな時に使うかYutaka Tachibana
 
Deep Learning on Rescale - Oct/11/2016 at Rescale night
Deep Learning on Rescale - Oct/11/2016 at Rescale nightDeep Learning on Rescale - Oct/11/2016 at Rescale night
Deep Learning on Rescale - Oct/11/2016 at Rescale nightRescale Japan株式会社
 
WebDB Forum 2012 基調講演資料
WebDB Forum 2012 基調講演資料WebDB Forum 2012 基調講演資料
WebDB Forum 2012 基調講演資料Recruit Technologies
 
なにわテック20180127
なにわテック20180127なにわテック20180127
なにわテック20180127Natsutani Minoru
 
これからのコンピューティングの変化とこれからのプログラミング at 広島
これからのコンピューティングの変化とこれからのプログラミング at 広島これからのコンピューティングの変化とこれからのプログラミング at 広島
これからのコンピューティングの変化とこれからのプログラミング at 広島なおき きしだ
 
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標Tomoharu ASAMI
 
新しいソフトウェアエンジニアリングのためのパターンランゲージに向けて
新しいソフトウェアエンジニアリングのためのパターンランゲージに向けて新しいソフトウェアエンジニアリングのためのパターンランゲージに向けて
新しいソフトウェアエンジニアリングのためのパターンランゲージに向けてHironori Washizaki
 
機械学習 - MNIST の次のステップ
機械学習 - MNIST の次のステップ機械学習 - MNIST の次のステップ
機械学習 - MNIST の次のステップDaiyu Hatakeyama
 
GTC Japan 2016 Rescaleセッション資料「クラウドHPC ではじめるDeep Learning」- Oct/5/2016 at GTC ...
GTC Japan 2016 Rescaleセッション資料「クラウドHPC ではじめるDeep Learning」- Oct/5/2016 at GTC ...GTC Japan 2016 Rescaleセッション資料「クラウドHPC ではじめるDeep Learning」- Oct/5/2016 at GTC ...
GTC Japan 2016 Rescaleセッション資料「クラウドHPC ではじめるDeep Learning」- Oct/5/2016 at GTC ...Rescale Japan株式会社
 
Pythonおじさんのweb2py挑戦記
Pythonおじさんのweb2py挑戦記Pythonおじさんのweb2py挑戦記
Pythonおじさんのweb2py挑戦記Yoshiyuki Nakamura
 
R超入門機械学習をはじめよう
R超入門機械学習をはじめようR超入門機械学習をはじめよう
R超入門機械学習をはじめよう幹雄 小川
 

Similaire à インターネット広告の概要とシステム設計 (20)

アドテクを支える技術 〜1日40億リクエストを捌くには〜
アドテクを支える技術 〜1日40億リクエストを捌くには〜アドテクを支える技術 〜1日40億リクエストを捌くには〜
アドテクを支える技術 〜1日40億リクエストを捌くには〜
 
クリスマスを支える俺たちとJava(JJUG CCC 2015 Spring AB4)
クリスマスを支える俺たちとJava(JJUG CCC 2015 Spring AB4)クリスマスを支える俺たちとJava(JJUG CCC 2015 Spring AB4)
クリスマスを支える俺たちとJava(JJUG CCC 2015 Spring AB4)
 
[db tech showcase Tokyo 2016] A25: ACIDトランザクションをサポートするエンタープライズ向けNoSQL Databas...
[db tech showcase Tokyo 2016] A25: ACIDトランザクションをサポートするエンタープライズ向けNoSQL Databas...[db tech showcase Tokyo 2016] A25: ACIDトランザクションをサポートするエンタープライズ向けNoSQL Databas...
[db tech showcase Tokyo 2016] A25: ACIDトランザクションをサポートするエンタープライズ向けNoSQL Databas...
 
Scrum alliance regional gathering tokyo 2013 pub
Scrum alliance regional gathering tokyo 2013 pubScrum alliance regional gathering tokyo 2013 pub
Scrum alliance regional gathering tokyo 2013 pub
 
データ分析に必要なスキルをつけるためのツール~Jupyter notebook、r連携、機械学習からsparkまで~
データ分析に必要なスキルをつけるためのツール~Jupyter notebook、r連携、機械学習からsparkまで~データ分析に必要なスキルをつけるためのツール~Jupyter notebook、r連携、機械学習からsparkまで~
データ分析に必要なスキルをつけるためのツール~Jupyter notebook、r連携、機械学習からsparkまで~
 
Kaggleのテクニック
KaggleのテクニックKaggleのテクニック
Kaggleのテクニック
 
MySQLで学ぶ機械学習ことはじめ.pdf
MySQLで学ぶ機械学習ことはじめ.pdfMySQLで学ぶ機械学習ことはじめ.pdf
MySQLで学ぶ機械学習ことはじめ.pdf
 
GraphQLはどんな時に使うか
GraphQLはどんな時に使うかGraphQLはどんな時に使うか
GraphQLはどんな時に使うか
 
Deep Learning on Rescale - Oct/11/2016 at Rescale night
Deep Learning on Rescale - Oct/11/2016 at Rescale nightDeep Learning on Rescale - Oct/11/2016 at Rescale night
Deep Learning on Rescale - Oct/11/2016 at Rescale night
 
WebDB Forum 2012 基調講演資料
WebDB Forum 2012 基調講演資料WebDB Forum 2012 基調講演資料
WebDB Forum 2012 基調講演資料
 
なにわテック20180127
なにわテック20180127なにわテック20180127
なにわテック20180127
 
これからのコンピューティングの変化とこれからのプログラミング at 広島
これからのコンピューティングの変化とこれからのプログラミング at 広島これからのコンピューティングの変化とこれからのプログラミング at 広島
これからのコンピューティングの変化とこれからのプログラミング at 広島
 
AWS re:Invent2017で見た AWSの強さとは
AWS re:Invent2017で見た AWSの強さとは AWS re:Invent2017で見た AWSの強さとは
AWS re:Invent2017で見た AWSの強さとは
 
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
 
新しいソフトウェアエンジニアリングのためのパターンランゲージに向けて
新しいソフトウェアエンジニアリングのためのパターンランゲージに向けて新しいソフトウェアエンジニアリングのためのパターンランゲージに向けて
新しいソフトウェアエンジニアリングのためのパターンランゲージに向けて
 
機械学習 - MNIST の次のステップ
機械学習 - MNIST の次のステップ機械学習 - MNIST の次のステップ
機械学習 - MNIST の次のステップ
 
GTC Japan 2016 Rescaleセッション資料「クラウドHPC ではじめるDeep Learning」- Oct/5/2016 at GTC ...
GTC Japan 2016 Rescaleセッション資料「クラウドHPC ではじめるDeep Learning」- Oct/5/2016 at GTC ...GTC Japan 2016 Rescaleセッション資料「クラウドHPC ではじめるDeep Learning」- Oct/5/2016 at GTC ...
GTC Japan 2016 Rescaleセッション資料「クラウドHPC ではじめるDeep Learning」- Oct/5/2016 at GTC ...
 
Pythonおじさんのweb2py挑戦記
Pythonおじさんのweb2py挑戦記Pythonおじさんのweb2py挑戦記
Pythonおじさんのweb2py挑戦記
 
組込みSW開発技術研究会キックオフミーティング
組込みSW開発技術研究会キックオフミーティング組込みSW開発技術研究会キックオフミーティング
組込みSW開発技術研究会キックオフミーティング
 
R超入門機械学習をはじめよう
R超入門機械学習をはじめようR超入門機械学習をはじめよう
R超入門機械学習をはじめよう
 

Plus de MicroAd, Inc.(Engineer)

20240229 DEIM2024 【技術報告】広告配信における安定して拡張性のある大量データ処理基盤の必要性と活用
20240229 DEIM2024 【技術報告】広告配信における安定して拡張性のある大量データ処理基盤の必要性と活用20240229 DEIM2024 【技術報告】広告配信における安定して拡張性のある大量データ処理基盤の必要性と活用
20240229 DEIM2024 【技術報告】広告配信における安定して拡張性のある大量データ処理基盤の必要性と活用MicroAd, Inc.(Engineer)
 
Kafka Connect:Iceberg Sink Connectorを使ってみる
Kafka Connect:Iceberg Sink Connectorを使ってみるKafka Connect:Iceberg Sink Connectorを使ってみる
Kafka Connect:Iceberg Sink Connectorを使ってみるMicroAd, Inc.(Engineer)
 
Apache Kafkaでの大量データ処理がKubernetesで簡単にできて嬉しかった話
Apache Kafkaでの大量データ処理がKubernetesで簡単にできて嬉しかった話Apache Kafkaでの大量データ処理がKubernetesで簡単にできて嬉しかった話
Apache Kafkaでの大量データ処理がKubernetesで簡単にできて嬉しかった話MicroAd, Inc.(Engineer)
 
Chromeの3rd Party Cookie廃止とインターネット広告への影響
Chromeの3rd Party Cookie廃止とインターネット広告への影響Chromeの3rd Party Cookie廃止とインターネット広告への影響
Chromeの3rd Party Cookie廃止とインターネット広告への影響MicroAd, Inc.(Engineer)
 
ベアメタルで実現するSpark&Trino on K8sなデータ基盤
ベアメタルで実現するSpark&Trino on K8sなデータ基盤ベアメタルで実現するSpark&Trino on K8sなデータ基盤
ベアメタルで実現するSpark&Trino on K8sなデータ基盤MicroAd, Inc.(Engineer)
 
DDD&Scalaで作られたプロダクトはその後どうなったか?(Current state of products made with DDD & Scala)
DDD&Scalaで作られたプロダクトはその後どうなったか?(Current state of products made with DDD & Scala)DDD&Scalaで作られたプロダクトはその後どうなったか?(Current state of products made with DDD & Scala)
DDD&Scalaで作られたプロダクトはその後どうなったか?(Current state of products made with DDD & Scala)MicroAd, Inc.(Engineer)
 
マイクロアドにおけるデータストアの使い分け
マイクロアドにおけるデータストアの使い分けマイクロアドにおけるデータストアの使い分け
マイクロアドにおけるデータストアの使い分けMicroAd, Inc.(Engineer)
 
データセンターネットワークの構成について
データセンターネットワークの構成についてデータセンターネットワークの構成について
データセンターネットワークの構成についてMicroAd, Inc.(Engineer)
 
インフラ領域の技術スタックや業務内容について紹介
インフラ領域の技術スタックや業務内容について紹介インフラ領域の技術スタックや業務内容について紹介
インフラ領域の技術スタックや業務内容について紹介MicroAd, Inc.(Engineer)
 
RTBにおける機械学習の活用事例
RTBにおける機械学習の活用事例RTBにおける機械学習の活用事例
RTBにおける機械学習の活用事例MicroAd, Inc.(Engineer)
 
アドテクに機械学習を組み込むための推論の高速化
アドテクに機械学習を組み込むための推論の高速化アドテクに機械学習を組み込むための推論の高速化
アドテクに機械学習を組み込むための推論の高速化MicroAd, Inc.(Engineer)
 
社内問い合わせ&申請・承認業務の 管理方法 - Jira Service Management 事例紹介 -
社内問い合わせ&申請・承認業務の 管理方法 - Jira Service Management 事例紹介 -社内問い合わせ&申請・承認業務の 管理方法 - Jira Service Management 事例紹介 -
社内問い合わせ&申請・承認業務の 管理方法 - Jira Service Management 事例紹介 -MicroAd, Inc.(Engineer)
 
Digdagを用いた大規模広告配信ログデータの加工と運用
Digdagを用いた大規模広告配信ログデータの加工と運用Digdagを用いた大規模広告配信ログデータの加工と運用
Digdagを用いた大規模広告配信ログデータの加工と運用MicroAd, Inc.(Engineer)
 
これから機械学習エンジニアとして戦っていくみなさんへ ~MLOps というマインドセットについて~
これから機械学習エンジニアとして戦っていくみなさんへ ~MLOps というマインドセットについて~これから機械学習エンジニアとして戦っていくみなさんへ ~MLOps というマインドセットについて~
これから機械学習エンジニアとして戦っていくみなさんへ ~MLOps というマインドセットについて~MicroAd, Inc.(Engineer)
 
マイクロアドにおけるCTR予測への取り組み
マイクロアドにおけるCTR予測への取り組みマイクロアドにおけるCTR予測への取り組み
マイクロアドにおけるCTR予測への取り組みMicroAd, Inc.(Engineer)
 
オンプレ×Google Cloud PlatformなML基盤におけるRancherの活用
オンプレ×Google Cloud PlatformなML基盤におけるRancherの活用オンプレ×Google Cloud PlatformなML基盤におけるRancherの活用
オンプレ×Google Cloud PlatformなML基盤におけるRancherの活用MicroAd, Inc.(Engineer)
 
琵琶湖を中心とした世界のようなお話
琵琶湖を中心とした世界のようなお話琵琶湖を中心とした世界のようなお話
琵琶湖を中心とした世界のようなお話MicroAd, Inc.(Engineer)
 
ソフトとかハードとか関係ございません
ソフトとかハードとか関係ございませんソフトとかハードとか関係ございません
ソフトとかハードとか関係ございませんMicroAd, Inc.(Engineer)
 
MySQL勉強会 クエリチューニング編
MySQL勉強会 クエリチューニング編MySQL勉強会 クエリチューニング編
MySQL勉強会 クエリチューニング編MicroAd, Inc.(Engineer)
 

Plus de MicroAd, Inc.(Engineer) (20)

20240229 DEIM2024 【技術報告】広告配信における安定して拡張性のある大量データ処理基盤の必要性と活用
20240229 DEIM2024 【技術報告】広告配信における安定して拡張性のある大量データ処理基盤の必要性と活用20240229 DEIM2024 【技術報告】広告配信における安定して拡張性のある大量データ処理基盤の必要性と活用
20240229 DEIM2024 【技術報告】広告配信における安定して拡張性のある大量データ処理基盤の必要性と活用
 
Kafka Connect:Iceberg Sink Connectorを使ってみる
Kafka Connect:Iceberg Sink Connectorを使ってみるKafka Connect:Iceberg Sink Connectorを使ってみる
Kafka Connect:Iceberg Sink Connectorを使ってみる
 
Apache Kafkaでの大量データ処理がKubernetesで簡単にできて嬉しかった話
Apache Kafkaでの大量データ処理がKubernetesで簡単にできて嬉しかった話Apache Kafkaでの大量データ処理がKubernetesで簡単にできて嬉しかった話
Apache Kafkaでの大量データ処理がKubernetesで簡単にできて嬉しかった話
 
Chromeの3rd Party Cookie廃止とインターネット広告への影響
Chromeの3rd Party Cookie廃止とインターネット広告への影響Chromeの3rd Party Cookie廃止とインターネット広告への影響
Chromeの3rd Party Cookie廃止とインターネット広告への影響
 
ベアメタルで実現するSpark&Trino on K8sなデータ基盤
ベアメタルで実現するSpark&Trino on K8sなデータ基盤ベアメタルで実現するSpark&Trino on K8sなデータ基盤
ベアメタルで実現するSpark&Trino on K8sなデータ基盤
 
DDD&Scalaで作られたプロダクトはその後どうなったか?(Current state of products made with DDD & Scala)
DDD&Scalaで作られたプロダクトはその後どうなったか?(Current state of products made with DDD & Scala)DDD&Scalaで作られたプロダクトはその後どうなったか?(Current state of products made with DDD & Scala)
DDD&Scalaで作られたプロダクトはその後どうなったか?(Current state of products made with DDD & Scala)
 
マイクロアドにおけるデータストアの使い分け
マイクロアドにおけるデータストアの使い分けマイクロアドにおけるデータストアの使い分け
マイクロアドにおけるデータストアの使い分け
 
データセンターネットワークの構成について
データセンターネットワークの構成についてデータセンターネットワークの構成について
データセンターネットワークの構成について
 
インフラ領域の技術スタックや業務内容について紹介
インフラ領域の技術スタックや業務内容について紹介インフラ領域の技術スタックや業務内容について紹介
インフラ領域の技術スタックや業務内容について紹介
 
RTBにおける機械学習の活用事例
RTBにおける機械学習の活用事例RTBにおける機械学習の活用事例
RTBにおける機械学習の活用事例
 
アドテクに機械学習を組み込むための推論の高速化
アドテクに機械学習を組み込むための推論の高速化アドテクに機械学習を組み込むための推論の高速化
アドテクに機械学習を組み込むための推論の高速化
 
社内問い合わせ&申請・承認業務の 管理方法 - Jira Service Management 事例紹介 -
社内問い合わせ&申請・承認業務の 管理方法 - Jira Service Management 事例紹介 -社内問い合わせ&申請・承認業務の 管理方法 - Jira Service Management 事例紹介 -
社内問い合わせ&申請・承認業務の 管理方法 - Jira Service Management 事例紹介 -
 
Digdagを用いた大規模広告配信ログデータの加工と運用
Digdagを用いた大規模広告配信ログデータの加工と運用Digdagを用いた大規模広告配信ログデータの加工と運用
Digdagを用いた大規模広告配信ログデータの加工と運用
 
これから機械学習エンジニアとして戦っていくみなさんへ ~MLOps というマインドセットについて~
これから機械学習エンジニアとして戦っていくみなさんへ ~MLOps というマインドセットについて~これから機械学習エンジニアとして戦っていくみなさんへ ~MLOps というマインドセットについて~
これから機械学習エンジニアとして戦っていくみなさんへ ~MLOps というマインドセットについて~
 
Cumulus Linuxを導入したワケ
Cumulus Linuxを導入したワケCumulus Linuxを導入したワケ
Cumulus Linuxを導入したワケ
 
マイクロアドにおけるCTR予測への取り組み
マイクロアドにおけるCTR予測への取り組みマイクロアドにおけるCTR予測への取り組み
マイクロアドにおけるCTR予測への取り組み
 
オンプレ×Google Cloud PlatformなML基盤におけるRancherの活用
オンプレ×Google Cloud PlatformなML基盤におけるRancherの活用オンプレ×Google Cloud PlatformなML基盤におけるRancherの活用
オンプレ×Google Cloud PlatformなML基盤におけるRancherの活用
 
琵琶湖を中心とした世界のようなお話
琵琶湖を中心とした世界のようなお話琵琶湖を中心とした世界のようなお話
琵琶湖を中心とした世界のようなお話
 
ソフトとかハードとか関係ございません
ソフトとかハードとか関係ございませんソフトとかハードとか関係ございません
ソフトとかハードとか関係ございません
 
MySQL勉強会 クエリチューニング編
MySQL勉強会 クエリチューニング編MySQL勉強会 クエリチューニング編
MySQL勉強会 クエリチューニング編
 

インターネット広告の概要とシステム設計

  • 2. 自己紹介 ● 名前: 松宮 康二(まっつー) ● 役職: シニアエンジニア DSP担当 ● 最近触ってるもの ● 最近の趣味: キャンプ ● ちょっと前の趣味: ラーメン作り ● Twitter: @mattsu6666 2
  • 3. もくじ ● インターネット広告とは ○ インターネット広告の市場規模 ○ ターゲティング広告 ○ DSP/SSPへの変遷 ○ 広告の指標 ○ 広告の品質維持 ○ プライバシーの問題 ● 広告配信システムの宿命 ○ 100msの制約 ○ 1つのエンドポイントに全ての機能が詰まっている ○ 増え続ける広告在庫 ○ 増え続けるリクエスト ○ まとめると ○ 業務課題に対するアプローチとキーワード ● なぜScala, DDD, Akkaなのか ○ Scala ○ なぜScalaなのか ○ 関数型言語はなぜシンプルなのか ○ ポリモーフィズムが重要な理由 ○ DDD ○ ドメインモデルをピュアにすべきな理由 ○ 巨大なモノリシックなアプリのメンテナビリティ ○ Akka ○ アクターモデル ○ スループットではなくレイテンシを高める ○ なぜScala, DDD, Akkaなのか ● まとめ 3
  • 5. インターネット広告の市場規模 ● 2019年、初めてインターネット広告費が2兆円超えでテレビメディア広告費を抜く ● 8年連続のプラス成長 ● 総広告費は6兆6,514億円なので、約30%がインターネット広告費 5 引用: https://www.dentsu.co.jp/news/release/pdf-cms/2020014-0311.pdf
  • 6. ターゲティング広告 ● インターネット広告の始まりは(日本だと)1996年頃 ● 最初はHTMLに直接広告を埋め込んでいた ● アドサーバの登場によって、動的に広告が表示できるようになる ● 会員制のWebサイトなら利用者の登録属性、IP、時間帯等に応じて広告を出し分けられる (ターゲティン グ広告) ● 具体的には下記のターゲティングが可能 (マイクロアドで利用可能な機能のみ掲載) ○ デバイスターゲティング ○ プレースメントターゲティング ○ オーディエンスターゲティング ○ ロケーションターゲティング ○ タイムターゲティング 6 Webページ 広告 Webページ 広告Webサーバ アドサーバ Webサーバ Cookie、IP、時間等を利用してユーザに 適切な広告を配信 予約しておいた広告を配信 アドサーバ以前 アドサーバ以降
  • 7. DSP/SSPへの変遷 ● 最初の頃、広告主はメディアや広告枠を選定して購入する必要があった (純広告) ● また、メディアは広告在庫が売れ残るリスクがあった ● そこで、複数メディアの広告枠をまとめて販売するアドネットワークが登場 ● しかし広告主、メディア双方にとってデメリットがあった ○ 広告主: 掲載面を選べないので、出したくないメディアにも広告が出る ○ メディア: 適正な価格で取引できない ● そこで、オープンな取引市場の役割を持ったアドエクスチェンジが登場 ● アドエクスチェンジを構成するツールがDSP (Demand Side Platform), SSP (Supply Side Platform) ● だったが、RTBが主流になり、DSP/SSPが直接繋がるようになる 7 Webページ 広告 Webページ 広告 Webページ 広告 アドネットワーク 広告主 広告枠をまとめて購入 アドエクスチェンジ DSPSSP 買いたい価格で買う 売りたい価格で売る オークション方式で取引 SSPDSP RTB (Real Time Bidding) DSP DSP SSP SSP SSPとDSP同士が相互に繋がる アドネットワーク アドエクスチェンジ DSP/SSP
  • 8. 広告の指標 ● 広告は様々な指標を使って効果を測定している ● 代表的な指標 ○ インプレッション数: 広告を表示した回数 ○ ビューアブルインプレッション数: 広告を表示して、ユーザが実際に見た回数 ○ クリック数: 広告をクリックした回数 ○ コンバージョン数: 商品の購入、サブスク、資料請求、アプリインストール、会員登録等の行動 ○ インプレッション単価 (CPM: Cost per Mille): 1000回あたりのインプレッション単価 ○ クリック率 (CTR: Click Through Rate): インプレッションのうちクリックした率 ○ クリック単価 (CPC: Cost per Click): 1クリックあたりの単価 ○ コンバージョン率 (CVR: Conversion Rate): クリックしてコンバージョンまで行った率 ○ コンバージョン単価 (CPA: Cost per Acquisition): コンバージョンあたりの単価 8 CTR低いですね。目標CPCを引き上げて様子見てみましょう。 インプレッションは出てますが、ビューアブルインプレッションは全く計測されませんね。 アドフラウド(広告詐欺)かも知れません。 予算10万円で100CPMなので100万インプレッションですね。ブランディング目的としてはい い調子です。 利用例 運用担当 開発担当 営業担当
  • 9. 広告の品質維持 ● 昨今、不適切なメディアへの配信によるブランド毀損の懸念があり、ブランドセーフティが注目される ○ 漫画村、Anitube等の違法サイトに広告を掲載していた広告代理店等が炎上 ● インターネット広告の仕組みを悪用したアドフラウド(広告詐欺)が問題になっている ○ これも漫画村で使われていたので、注目が集まった 9 アドベリフィケーションの重要性が増す DSP DB ブランドセーフティ API アドフラウドAPI URL/IPで問い合わせ 定期的にDBを更新 アドベリ関連のソリューションを提供している会社例 DSPによるアドベリの活用
  • 10. プライバシーの問題 ● ターゲティング広告ではユーザのトラッキングが重要 ● しかし、世の流れ的にはターゲティング広告は規制の対象になり始めている ● EUでは一般データ保護規則(GDPR)が2018年5月に施行 ○ 日本の企業でも欧州圏のユーザをトラッキングすると罰則 ○ 加えて、eプライバシー規則が新たに審議されている ● SafariではITP(Intelligent Tracking Prevention)によってサードパーティクッキーをブロック ● Googleが推進するPrivacy Sandboxによってクッキーの代替案が提案 ● 改正個人情報保護法が2020年6月に成立。2022年6月までに施行予定 ○ ユーザのトラッキングに同意が必要になる ● 今後は「プライバシーテック」が流行るような気がしている (個人的見解) 10 Webページ 計測 タグ Webページ 計測 タグ 計測 サーバ Webページを横断して計測 (Cookieを利用) DSPDB 永続化 RTB時に参照 Cookieを利用した トラッキング
  • 13. 100msの制約 ● SSPがDSPへ入札要求をしてから100ms以内に返却することが必須条件 ● 100msを超えた場合はタイムアウトで入札が拒否される ● レイテンシを含む時間なので現実的には遅くても30ms程度で処理する ● 入札できない = 落札されない = 売上を生まない = 倒産 13 100msの制約を守ることは業務が成立する必要条件 SSP DSP A DSP B DSP C WEBページ 広告枠 入札要求 100ms以内に応答しないとタイムアウト 応札(50ms) 広告をリクエスト 広告をレスポンス 応札(100ms) 応札(150ms) 入札要求 入札要求 50msで応答してい るので入札成功 100msで応答して いるので入札成功 150msで応答して いるので入札失敗
  • 14. 1つのエンドポイントに全ての機能が詰まっている ● 一般的なWebアプリ等と異なり、エンドポイントはSSP毎に1つだけ ○ 設計次第だがマイクロアドではSSP毎にエンドポイントを分けている ○ 1つのAPIに対して機能追加し続けるイメージ ● ビジネスのスケールとともに機能は増え続ける ● 機能が増えても100msの制約は不変 ● しかし機能追加は避けては通れない 14 機能追加は業務を継続する必要条件 SSP A DSP 入札要求 POST /rtb/a SSP B 入札要求 POST /rtb/b SSP C 入札要求 POST /rtb/c 位置情報を使う機能 ユーザの性別とか判定する機能 ユーザと似たユーザを検索する機能 行動履歴を使う機能 ブラックリストユーザ判定機能 ヽ(・ω・ヽ*) PDM オフライン購買データを使う機能 新機能追加して! RTBの内部処理 ・・・ 機能追加をすればする程、RTBの内部処理は 複雑かつ高負荷になっていく。
  • 15. 増え続ける広告在庫 ● ビジネスのスケールとともに扱う広告在庫は増大 ※広告在庫とは広告の表示可能回数のこと ● 1度のRTBで出来るだけ多くの広告を配信対象にしたい ● 多くの広告在庫を扱える = より精度の高い広告を配信可能 = 高い広告効果 ○ また、たくさん表示可能なため単純に売上が伸びる ● 一方で扱う広告の増大は処理負荷の増大に直結 ● 少なくても業務は成り立つけど、スケールしない 15 多くの広告在庫を扱えることは業務が成立する十分条件 SSP DSP 入札要求 応札 化粧品関連のページから リクエスト うーん・・・とりあえず健 康関連? DSP 化粧品が最適!(略) 入札要求 応札 DSP(略) 入札要求 応札 (タイムアウト) 化粧品 関連 健康 関連 旅行 関連 広告在庫 健康 関連 旅行 関連 広告在庫 旅行 関連 健康 関連 化粧品 関連 広告在庫 ・・・ お、おおすぎる! 処理が間に合わねぇ 広告在庫が少ないと・・・ 広告在庫が多いと 広告在庫が多過ぎると 処理が間に合わず機会損失が発生するのは もったいない! こうならないようにエンジニアが頑張る
  • 16. 増え続けるリクエスト ● ビジネスのスケールとともに受けるリクエストは増大 ● 出来る限り多くのリクエストを受けたい ● 大量のリクエスト = 入札機会の増大 = 売上アップ ● 大量のリクエストを捌きたいなら・・・ ○ サーバを増やす ○ サーバのスペックを上げる ● しかし・・ ○ サーバは高い(1台辺り10~20万) ○ ラックに限りがある ○ 1台辺りの収益率が落ちるのは本末転倒 ● よって、富豪的アプローチで万事解決とは行かない ● ハードに頼り切るのではなく、ソフトウェアも限界までチューニング 16 大量のリクエストが捌けることは業務が成立する十分条件 日毎のリクエスト数 ※軸の値は伏せてます 増加傾向にある
  • 17. まとめると ● 100msの制約を守ることは業務が成立する必要条件 ● 機能追加は業務を継続する必要条件 ● 多くの広告在庫を扱えることは業務が成立する十分条件 ● 大量のリクエストが捌けることは業務が成立する十分条件 17 このようなアドテク特有の課題をどうやってクリアするか? 100msの制約 機能追加 多くの広告在庫を扱える 大量のリクエストが捌ける 業務
  • 18. 業務課題に対するアプローチとキーワード ● プログラミング言語にScalaを採用 ○ 関数型プログラミング ○ オブジェクト指向プログラミング ○ JVM言語 ● ソフトウェアの設計手法にドメイン駆動設計(DDD)を採用 ○ 3層 + ドメインアーキテクチャ ○ ドメインモデル ○ ユビキタス言語 ● 主要なフレームワーク・ツールキットにAkkaを採用 ○ 並行並列処理 ○ リアクティブシステム ○ アクターモデル 18 次のスライドから詳細な説明をしていきます
  • 20. Scala ● JVM言語の1つ ● 静的型付け言語 ○ 型推論・パターンマッチング ● 小規模なスクリプトから大規模システムの構築まで幅広く利用可能 ○ Scalaはscalable languageに由来する ● すべてのJava製ライブラリと相互運用可能 ● オブジェクト指向と関数型プログラミングの概念を持つ ● 充実したコレクションAPI ○ ループ処理ではなく述語関数によって表現 20 object Main extends App { println("Hello world") } Seq(1,2,3,4,5) .map(_ * 2) .filter(_ > 5) > Hello world > Seq[Int] = List(6, 8, 10) Hello worldの例 述語関数を使った例(for文を使わずにループ処理)
  • 21. なぜScalaなのか ● 関数型言語の特徴を持っており、シンプルに記述できる ○ イミュータブル ○ 副作用を発生させづらい構文(例えばif文ではなくif式) ○ nullを発生させないデータ構造 ● オブジェクト指向言語の特徴を持っており、DDDとの相性が良い ○ ポリモーフィズム(最も重要!) ※後述 ○ カプセル化 ○ 継承 ● JVM言語の安心感 ○ 十分な実績を持つJavaとの互換性 ○ JVM上で動作するため、Javaに近い性能を期待できる ○ コンパイル言語なので、型安全による安心感 21
  • 22. 関数型言語はなぜシンプルなのか ● 関数型プログラミングは純粋関数だけを使う ○ 純粋関数とは副作用がない関数 ● 副作用とは関数内で副次的に発生するアクション ○ グローバル変数に再代入する ○ データベースを参照・更新する ○ I/O ○ 例外を投げる等 ● 純粋関数は入力に対して必ず同じ出力がある ● システムの状態に依存しないので... ○ 頭の中で状態を追いながら読まなく良い ○ テストコードが書きやすい 22 class Auth { public void auth(Token token) { token.set(getAuth()) } } 副作用があるケース(コードはJava) class Auth { def auth(token: Token): Token = { token.copy(getAuth()) } } 副作用がないケース 返り値(結果型)がvoidかTokenの違いがある 副作用があるケースは「 tokenを更新」 副作用がないケースは「 tokenを新規作成」
  • 23. ポリモーフィズムが重要な理由 ● ポリモーフィズム(多態性)はインタフェースに実装できる性質 ○ オブジェクト指向以前もポリモーフィズムは可能だったが、言語レベルで安全に実装できるようになった (だからこそ重要) ● インタフェースによってプログラムをより抽象的・汎用的に記述できる ○ 例えばUNIXのIOデバイスドライバはopen, close, read, write, seekの標準機能を提供する ○ もしインタフェースが統一されていなかったら、デバイス依存のコードになり用途が限られる ● インタフェース同士が依存し合うことで高いモジュール性・疎結合性を得る ● ポリモーフィズムによって、ソースコードの依存関係を絶対的に制御(※後述) 23 モジュール同士が抽象に依存 具象クラスを自由に付け替えられる => 疎結合 UNIXはデータの入出力をファイルとして扱う => デバイス非依存
  • 24. DDD ● DDD(ドメイン駆動設計)はソフトウェア設計手法のこと ○ 技術では無く、ドメイン知識(業務知識)を中心に考える ● 事業価値を最大化することが我々の究極の目標 ● しかし実際には... ○ ドメインエキスパート(PDMなどドメインに詳しい人)は事業価値の向上に注力 ○ エンジニアは業務上の問題を技術的に解決しようとする ○ エンジニアによって翻訳されたソフトウェアになってしまう ○ 両者のコミュニケーションの相違が起こってしまう ● DDDはドメインエキスパートとエンジニアが共通認識(ユビキタス言語)を 持ったソフトウェアを作る(コードがドメインモデルを反映) 24 (・ω・*) PDM 「広告」には「画像」とか「動画」とかの種類があるんだよ なぁ。 「広告主」がどっちか選んで「 登録」するんだよねぇ エンジニア (,,゚Д゚) 画像とか動画とかいってもフォーマット色々あるし、「 JPEG 広告」「PNG広告」「MP4広告」みたいな感じで実装すっか。 生成ロジックを統一したいし、「 ユーザ」が「広告ジェネレー タ」を使って「生成」するようにしよっと。 下の会話では両者が違う言葉を使っている。 この状況が続くと、両者の認識のズレは拡大し、いつかプロ グラムの修正が困難な状況に陥る可能性が高い
  • 25. ドメインモデルをピュアにすべきな理由 ● ドメインモデルは何にも依存させるべきではない(ピュアにすべき) ● さらに、ビジネスルールは技術的関心事に左右されるべきではない ● ビジネスルールとはドメインモデルの構成要素 ○ "Business rules describe the operations, definitions and constraints that apply to an organization. Business rules can apply to people, processes, corporate behavior and computing systems in an organization, and are put in place to help the organization achieve its goals." ○ つまり、ビジネス活動の中で意思決定を行うための規則 ○ 個人的には、コンピュータが消滅しても失われないルールのことだと思ってる ○ 僕らが一番守りたいのはビジネスルール 25 ※広告の例だと 分かりづらかっ たので お店を例にしま した ECサイト ~インターネット時代~商品を買う例 お店 ~近代~ お店 ~昔~ ● 合計の求め方 ● 小計の求め方 ● 消費税の求め方 などは「会計システム」「POSシステ ム」「そろばん」(技術的関心事)に左 右されるべきじゃない! 引用: https://en.wikipedia.org/wiki/Business_rule
  • 26. 巨大なモノリシックなアプリのメンテナビリティ ● 広告配信システムは非機能要件的にどうしてもモノリシックな一枚岩に ● 一枚岩故にドメインはめちゃくちゃ複雑 ● 一枚岩なのに色んなシステムと接続しまくる ● 何も考えずに作ったらメンテナビリティは容易に悪化 ● DDDを取り入れ多層アーキテクチャによってドメインモデルを保護 ● レイヤーの依存関係を厳格にし、影響範囲の局所化と明確化 26 プレゼンテーション層 データソース層 アプリケーション層 ドメイン層 A B AはBに依存している HTTPやRPCなどの入力の インタフェースを担当 ユースケースを担当 (ビジネスロジック) DB接続周り担当 ビジネスルール担当 (ドメインモデル)
  • 27. Akka ● Scala製の並行並列処理に特化したツールキット(フレームワークとライブラリを合わせたやつ) ● 主にLightbend社によって開発・メンテされているOSS ● 並行並列、分散システムを簡単に記述するためにアクターモデルを提供 ○ アクターモデル自体は1973年に登場 ○ クラウドコンピューティングの進歩とムーアの法則の終焉などでスケールアウトが主流になってきたことで 再び注目を浴びてきた ● アクター以外にAkka Streams, Akka Clustring, Akka HTTP等様々なコンポーネントを提供している ● Akkaはリアクティブ宣言に基づいて設計されている ○ 「リソースを効率よく利用し、アプリケーションをを自動的にスケールできるようにすること」 (Akka実践バイブルより引用) 27 引用: https://www.reactivemanifesto.org/ja
  • 28. アクターモデル ● アクターはメッセージ駆動の計算実体(スレッドに似ている) ○ アクターは非同期に実行される ● アクター同士(数千・数百万)が協調して1つのアプリケーションを構成する ● アトミックやロックを使わず、安全に並行並列処理が実装できる ○ アクターはメールボックス(メッセージキューみたいな)を持っていて、1度に1つ処理 ● アクターはfire-and-forget(撃ちっぱなし)の性質によって、非同期処理を実現している ● スケーラビリティのためにアクター同士は疎結合になっている ○ 空間/位置: 位置透過性とも。同じノード、異なるノード等、どこにアクターがいても良い ○ 時間: アクターはタスクの完了について何も保証しないし、期待もしない ○ インターフェース: アクター同士は何も共有しない。インタフェースが正しいかとか関係ない 28 Actor Actor Actor メッセージ送信 メッセージ送信 メッセージ送信 アクターシステム メールボックス (メッセージキュー) アクターは非同期で動作するのでア クターの数だけ並行並列に動作可 能 ロックとかアトミックな操作は一切不 要 メッセージを受信し て何か処理
  • 29. スループットではなくレイテンシを高める ● アクターモデルによって、並行並列処理が安全に実装可能 ● スレッドでは実現出来なかったスケールアウトも可能 ● アクターによって処理を細かい単位で分離するので、局所的にスケール可能 ● よって、Akkaを採用することにした ● しかし・・・良いことばかりではない ○ 高い学習コスト ○ アプリケーションの性質上、コアなロジックはアクターによるスケールアウトが難しい(通信コストが無視出来ない) ○ まだ発展途上のOSSのため、バージョン上がるとガッツリAPIが変わってる ● スループットは変わらないが、レイテンシは高めたい(アクターモデルの恩恵を享受) ○ 全体をそれなりに早くではなく、1リクエスト辺りの応答速度を高めたい ○ 大量のリクエストを満遍なくタイムアウトさせるより、少量のリクエストを確実に返せた方が良い ○ そのためにはアクターモデルを活用した並行並列処理が使いやすい 29 リクエスト1の処理 リクエスト2の処理 リクエスト1の処 理 リクエスト1の処 理 リクエスト2の処 理 リクエスト2の処 理 スレッド1 スレッド2 200ms スレッド1 スレッド2 200ms 200msでどちらも2件のリクエストを 捌いた。 しかし、左は200msかかってしまっ てタイムアウトになった 一方で右は100msで応答したので 入札できた 広告配信システムでは100msの制 約があるのでタイムアウト! 超理想の話なので実際にはこんな 綺麗に並列化は難しい
  • 30. なぜScala, DDD, Akkaなのか ● Scala ○ オブジェクト指向、関数型のメリットを享受できる ○ JVM上で動作するので性能面での安心感 ○ 強力な型システムによって規模の拡大が原因でメンテナビリティが低下しづらい等 ● DDD ○ 複雑なドメインに立ち向かう手段 ○ ビジネスルールに集中でき、事業価値を高めやすい ○ Scalaと相性が良い(オブジェクト指向との相性が良い) ● Akka ○ 並行並列処理、分散処理を安全に実装できる ○ 様々な便利なコンポーネントが使える 30
  • 31. まとめ ● インターネット広告の概要について話した ○ 市場規模は2019年に2兆を超え、益々注目を浴びている ○ DSP/SSPが登場し、ターゲティング広告が主流になった ○ 広告の効果を測る、代表的な指標を紹介した ○ 近年は広告の品質やプライバシーの問題に注目が集まっている ● 広告配信システムが持つ特殊な要件を話した ○ 100msの絶対的な制約があり、それを満たしたシステム設計を求められる ● 広告配信システムを実現するために使用した技術の説明をした ○ Scala, DDD, Akkaを取り上げ、システム設計の一部を紹介した ○ Scalaは関数型、オブジェクト指向型であり、大規模な開発に耐えうる言語であった ○ DDDを導入することで、複雑な仕様のシステムにおけるメンテナビリティの向上に努めている ○ Akkaを利用することで、コアなロジックを簡潔に保つような設計にしている 31
  • 33. 参考文献 ● 必携 インターネット広告 ● Scalaスケーラブルプログラミング第3版 ● Scala関数型デザイン&プログラミング―Scalazコントリビューターによる関 数型徹底ガイド ● Clean Architecture 達人に学ぶソフトウェアの構造と設計 ● 実践ドメイン駆動設計 ● Akka実践バイブル アクターモデルによる並行・分散システムの実現 ● 現場で役立つシステム設計の原則 〜変更を楽で安全にするオブジェクト指向 の実践技法 33