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
RWC2019 rubyによる超大量データ配信
Search
Daisuke Yamazaki
November 24, 2019
Technology
0
98
RWC2019 rubyによる超大量データ配信
Ruby World Conference 2019 rubyによる超大量データ配信
Daisuke Yamazaki
November 24, 2019
Tweet
Share
More Decks by Daisuke Yamazaki
See All by Daisuke Yamazaki
ノートラブルシステムへの道
yamaz
21
7k
学び実践してきたこと
yamaz
0
56
スケールアウト再考
yamaz
1
210
RTB 30 min
yamaz
0
41
RailsとCで広告システムを作って起業した話
yamaz
0
91
robust logprocessing
yamaz
0
17
adserver 30min
yamaz
0
25
Other Decks in Technology
See All in Technology
一生覚えておきたい「システム開発=コミュニケーション」〜初めての実務案件振り返りLT〜
maimyyym
0
130
Cloud Native Java with Spring Boot (CNCF Aarhus, April 2024)
thomasvitale
1
170
アクセス制御にまつわる改善 / Improving access control
itkq
0
530
元インフラエンジニアに成る / Human Resources to Human Relations
bobtani
4
910
非同期推論システムによるコスト削減と信頼性向上
koki_nishihara
0
230
開発生産性大幅アップ!Postman VS Code拡張機能
nagix
2
370
複雑な構成要素を持つUIとの向き合い方 〜新・支出グラフでの実例〜 / B43 TECH TALK
nakamuuu
0
140
Google Cloud Next '24でブログを10本書いた方法と勉強会を沸かせた方法
yasumuusan
0
290
MySQL の SQL クエリチューニングの要所を掴む勉強会
andpad
2
6.2k
Cracking the KubeCon CfP
inductor
2
240
Meta Quest 3 で動く桜マシマシ WebXR アプリを IBM Cloud Code Engine と Babylon.js で作った話
1ftseabass
PRO
0
120
JSON攻略法.pdf
miyakemito
8
5k
Featured
See All Featured
For a Future-Friendly Web
brad_frost
172
9k
Java REST API Framework Comparison - PWX 2021
mraible
PRO
18
6.9k
Designing for Performance
lara
601
67k
Learning to Love Humans: Emotional Interface Design
aarron
267
39k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
9
8.3k
The Mythical Team-Month
searls
216
42k
Facilitating Awesome Meetings
lara
42
5.6k
Done Done
chrislema
178
15k
Imperfection Machines: The Place of Print at Facebook
scottboms
260
12k
Bash Introduction
62gerente
604
210k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
501
140k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
155
14k
Transcript
Rubyによる超大量データ配信 Ruby World Conference 2019 Supership CTO Daisuke Yamazaki
2 About me Supership CTO Daisuke Yamazaki Supership 取締役 CTO
2006年 スケールアウトを創業 2013年 買収されKDDIグループ入り 2015年 会社が合併し、Supershipとして再出発
3 今日話す順番 • 弊社の紹介 • Rubyでいかに大量配信システムを構築したか • Rubyでいかにビジネスニーズと相対してきたか 今日のアジェンダは以下の通りです (所要時間:30分)
4 Confidential ձࣾ֓ཁ άϧʔϓձࣾ ΤʔδΣϯγʔ ෆਖ਼ࠂରࡦ ,%%*͔Βग़ࢿΛड͚Δ4VQFSTIJQϗʔϧσΟϯάεͷࢠձࣾͱͯ͠ɺ ݄ઃཱɻ ,%%*ͷઓུࢠձࣾͱͯ͠ɺΠϯλʔωοτͰ෯͘ࣄۀΛਪਐɻ "*ɾσʔλੳ
5 αʔϏε֓ཁ ࠃ࠷େڃࠂ৴ϓϥοτϑΥʔϜʮ4DBMFPVU"E1MBUGPSNʯͷఏڙ "E1MBUGPSN্ͷओͳϓϩμΫτ ˝"E(FOFSBUJPO ΠϯϓϨογϣϯɿԯʗ݄ ొϝσΟΞɿ BQQTɾTJUFT ओཁϝσΟΞɿδϞςΟʔɺάϊγʔɺχίχίಈըɺ༗໊ϝσΟΞଟ ˝4DBMF0VU%41
ϦΫΤετɿ ԯ݄
6 About ScaleoutAdPlatformについて カジュアル(=安価)にあらゆる広告配信ニーズを満 たすべく開発された純国産広告配信管理システム (弊社メインプロダクト) 1. 現在総アクセスは月間一兆ほど 2. SSP/DSP/屋外広告/OEMなど、その他デジタル広
告配信に関することなら何でも対応可能
7 Rubyと配信システムについて
8 全体概要 Logs 広告案件データ(PostgreSQL) 配信管理 システム 集計管理 システム 配信部分 C++,
ruby, swig 独自DB 管理システム ほとんどRails 配信サーバ C++サーバ
9 配信部分 Logs 広告案件データ(PostgreSQL) 配信管理 システム 集計管理 システム 配信部分 C++,
ruby, swig 独自DB 管理システム ほとんどRails 配信サーバ C++サーバ
10 配信部分 • 複数プロセスがSharedMemoryを介してデー タをやりとり 広告案件データ(SharedMemory) C++サーバ User Access 管理プログラム群
管理DB
11 データの管理はruby+swigで 管理DBからDBアップデート用DSLを作成し、各ADSVRで実 行することにより、Sharedメモリを書き換える ADServer DB C++API,SwigなRuby スクリプトを生成 ADServer ADServer
各ADServer loader = SoAdsScheduleLoader.new loader.start_create_adsshm loader.add_constraint(:constraintid => "0", :expression => "true;") loader.add_constraint(:constraintid => "true_func", :expression => "true;") loader.add_constraint(:constraintid => "rtb-common-template", :expression => <<-EOT) (function() { var result = candidate_context_get("rtb_result"); set_adrequest_cache("user-common-html", result.template_callback()); return true; })(); EOT
12 データ反映用DSL(抜粋) loader = SoAdsScheduleLoader.new loader.start_create_adsshm loader.add_constraint(:constraintid => "0", :expression
=> "true;”) loader.add_constraint(:constraintid => "true_func", :expression => "true;”) loader.add_constraint(:constraintid => "rtb-common-template", :expression => <<-EOT) (function() { var result = candidate_context_get("rtb_result"); set_adrequest_cache("user-common-html", result.template_callback()); return true; })(); EOT # DSL(Ruby Ofcource)
13 DSLがrubyでうれしいこと(その1) tl = SoAdsTreeLoader.new tl.add("2075500479","784200084") tl.add("2075500768","2075500767") tl.add("2075500505","2075500503") SharedMemoryのデータレイアウトが変わってもDSLは一緒な ので、バージョンアップ時のデータ移行が簡単
データの互換性をrubyレベルで担保できる
14 DSLがrubyでうれしいこと(その2) has_var_loader_class = SoAdsVarLoader rescue false vl = SoAdsVarLoader.new
if has_var_loader_class Rubyなので、メタプログラミングと組み合わせてやりたい放題 新機能をクラス化して、クラスが存在するときだけ 新機能を実行させるなど自由自在。
15 集計部分 • 配信サーバ側で一次処理、集計サーバでマージ集計 • 一次集計はログ形式を工夫することで速度を稼ぐ • 分散処理な為、基本集計に関しては全部rubyでも間に合ってる
16 集計システム概要 広告案件データ(PostgreSQL) マージ&ロード 集計システム (Rails) Logs 一次集計 (Ruby&C++Extention) 配信サーバ
processedLog
17 一次集計 配信サーバ側で一次処理を行い、データを圧縮 (数100MB→数100KBに) またログ形式を工夫することで速度を稼ぐ 色々間に合わなかったので、ここはC++Extention Logs 一次集計 (Ruby&C++Extention) 配信サーバ
processedLog
18 マージ集計 広告案件データ (PostgreSQL) マージ&ロード(ruby) 各ADSVRで一次集計されたデータをマージ集計し、 DBに流し込み(Rubyでもなんとかなってる)。 processedLog
19 スケーラビリティについてのまとめ • だいたいrubyでなんとかなってる • 速度がどうしても稼げないところはC++など • 上手に役割分担させることで一兆アクセスでもいけてる
20 Rubyとビジネスについて
21 About Scaleout AdPlatform ScaleOut Ad Platform Supership Inc. 5BH.BOBHFNFOU
%.1 %41 441 SE1BSUZ"E4FSWFS 7JEFP 3FXBSE 7JEFP"ET 1.1 0&.
22 デジタル広告業界を取り巻く状況
23 大企業とベンチャーの相性について 理想 ベンチャーの機動力と大企業のリソースを合わせてうまいことやる 現実 • 大企業そんなにスピード早くない • 突然大企業側が本気出したときに案件のデカさに ベンチャー側が耐えられない(こっちが非常に多い!)
24 ベンチャーとして戦い続けるにはどうすればいいか? 起業前に1ヶ月ほど考えた
25 大企業と協業するにあたって出した結論 • 超スケーラビリティがあって • 超柔軟性があって • 超落ちない 超すごいシステムがあれば大企業の要望に答えられる
26 実装について考えたこと
27 超すごいシステムを作るにあたって考えたこと 普通にプログラムを書いただけだと、普通のプロダクトに なってしまうだろう →成功しているOSSやシステムを参考にすれば 何かしら知見が得られるはずと考えた
28 参考にしたポイント 1. 古くからあるOSS →どうやって長い間成長できたのかを分析 →思想にたどり着けるはず 2. 新しく出たOSS →既存の問題を解くべく現れたはず →差分を見れば思想にたどり着けるはず
29 設計にあたって参考にしたOSSなど • RAID • qmail • Emacs, Lisp •
(もちろん)Ruby, Rails
30 RAID 構成するコンポーネントが不安定だからとい って全体の安定性を諦める必要はない
31 qmail • Sendmailの対抗(今はPostfix?) 複数のプログラムがお互いを過度に信用 せず、協調してシステムを構築する
32 Emacs(Lisp), Firefox(JS) 描画エンジン+ EmacsLisp 描画エンジン+ JavaScript 言語を内蔵していて、機能をあとからじゃんじゃん足せる
33 Emacs(Lisp), Firefox(JS) 今時のユーザからのソフトウェアへの要求は余りに多く, プログラマ にはほとんど予想しきれない. (略)ユーザの望みを完璧に叶えるソ フトウェアをプログラマが供給できなくとも, プログラマには拡張で きるソフトウェアを供給することはできる
(ポール・グラハム On Lispより)
34 なぜRuby及びRailsを選んだか? 会社立ち上げ当時(2006年)、開発機のOSはFreeBSD で、言語はさておき、よいORMを探していた。 Catalystだ!→ CPAN地獄にはまり挫折 PHPだ! → ORMがほぼなかった(当時) Javaだ!
→ PHPと同様 Rails? → インストール一発!AR最高! ということでRails(当時1.1)になりました ぶっちゃけたまたまですが、人にも異様に恵まれて とてもよい選択だったと思います。
35 実際の実装について
36 広告システムの正体 「広告システムとは」 その瞬間の状況に応じた最適なコンテンツ (= Markup Languageで記述された小さなテキスト片)を 超柔軟かつ超高速に選択し、配信し、集計できる仕組み
37 小さなHTML片? 広告クリエイティブの正体はテキストと素材データ - Banner(gif,jpg,flash,text) - TextMail - 3rdParty Tag
- Video Ads - InGame Ads - Etc.. Text(Metadata) + Raw Material (gif,jpg,swf,flv) 正体は?
38 ScaleoutAdPlatformの構成 コンテンツ配信管理システム(socdm.com) (配信及びログ集計) 広告配信システム 広告アプリA 広告アプリB 広告アプリC まず汎用の配信システムを作り、 その上に汎用の広告配信システムを作り、
更にその上に広告アプリとしてSSP/DSPを構築
39 なぜ別々に作らなかったか? すでに数千億アクセスをさばいており新規のアプリも 頑強なシステムの上でアプリを作るため、安定性が高い 長い時間かけて練られて 実績もあるシステムが土台としてある 安定性が高いものが最初から作れる コンテンツ配信管理システム(socdm.com) (配信及びログ集計) 広告配信システム
広告アプリ1 広告アプリ2 NewApp
40 広告システムに求められる要件(再掲) • 超スケーラビリティがあって • 超柔軟性があって • 超落ちない 配信サーバは当時Cで書かれてたので、 頻繁にアップデートしたくなかった。
→配信サーバに手を入れることなく任意の機能追加ができればいいと 考えた。
41 ビジネスロジックをシステムから分離させた 管理DBにビジネスロジックを登録するとADSVRに 自動でロードされる (=新ロジックの実装にADSVRのVerUp必要なし) ADServer DB (IncludingBusinessLogic) BusinessLogic Description
Language ADServer ADServer 各ADServer loader = SoAdsScheduleLoader.new loader.start_create_adsshm loader.add_constraint(:constraintid => "0", :expression => "true;") loader.add_constraint(:constraintid => "true_func", :expression => "true;") loader.add_constraint(:constraintid => "rtb-common-template", :expression => <<-EOT) (function() { var result = candidate_context_get("rtb_result"); set_adrequest_cache("user-common-html", result.template_callback()); return true; })(); EOT
42 ビジネスロジック記述言語? loader.add_constraint(:constraintid => "rtb-common-template", :expression => <<-EOT) (function() {
var result = candidate_context_get("rtb_result"); set_adrequest_cache("user-common-html", result.template_callback()); return true; })(); EOT ぶっちゃけJavaScriptです。 というかADSVRにJSエンジン積んでます(SpiderMonkey)
43 JavaScriptの嬉しさ • JavaScriptなので、やりたい放題 • 設定するお客さんもまぁ許容してくれる(最初はSchemeとか検討し ました) • Google(v8)とかMozillaが勝手にエンジンを早くしてくれるかも? →ビジネスロジックであるJSの生成はrubyで行ったわけですが、
実際それは非常にうまく機能し、大企業の要望を満たすことができま した。
44 Yconbinator ポール・グラハムの言葉(その2) Beating The Averages(普通のやつらの上を行け 2001年) http://pactical-scheme.net/trans/beating-the-averages-j.html 私達のソフトウェアがユニークだったのは、それが主にLispと呼ばれ る
プログラミング言語で書かれていたからだ。 (略)そして、パワー において劣る他の言語を使っている競争相手に対して、 Lispは強力な アドバンテージとなった。
45 当時(2006年)私が思ったこと あれ?ポール・グラハムはLispでライバルを蹴散らしたけど、 それって当時Ruby/Rails相当をもってたってことじゃない? →もう確かめる方法はないのですが、私にとってのLispはRubyで、 実際戦い抜くことができてます。たぶんrubyでなかったら途中でビジ ネスが頓挫していた可能性は高かったと思います。
46 まとめ • Rubyで超大規模システムを構築することはもはや当たり前 • 起業は海の向こうだけの話ではなく、我々でも十分可能 (でも結構大変) • プログラミングはエンジニアにパワーを与えてくれて、世界を変え ることができる
47 ご清聴ありがとうございました