Upgrade to Pro — share decks privately, control downloads, hide ads and more …

RWC2019 rubyによる超大量データ配信

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.

RWC2019 rubyによる超大量データ配信

Ruby World Conference 2019 rubyによる超大量データ配信

Avatar for Daisuke Yamazaki

Daisuke Yamazaki

November 24, 2019
Tweet

More Decks by Daisuke Yamazaki

Other Decks in Technology

Transcript

  1. 2 About me Supership CTO Daisuke Yamazaki Supership 取締役 CTO

    2006年 スケールアウトを創業 2013年 買収されKDDIグループ入り 2015年 会社が合併し、Supershipとして再出発
  2. 8 全体概要 Logs 広告案件データ(PostgreSQL) 配信管理 システム 集計管理 システム 配信部分 C++,

    ruby, swig 独自DB 管理システム ほとんどRails 配信サーバ C++サーバ
  3. 9 配信部分 Logs 広告案件データ(PostgreSQL) 配信管理 システム 集計管理 システム 配信部分 C++,

    ruby, swig 独自DB 管理システム ほとんどRails 配信サーバ C++サーバ
  4. 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
  5. 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)
  6. 14 DSLがrubyでうれしいこと(その2) has_var_loader_class = SoAdsVarLoader rescue false vl = SoAdsVarLoader.new

    if has_var_loader_class Rubyなので、メタプログラミングと組み合わせてやりたい放題 新機能をクラス化して、クラスが存在するときだけ 新機能を実行させるなど自由自在。
  7. 21 About Scaleout AdPlatform ScaleOut Ad Platform Supership Inc. 5BH.BOBHFNFOU

    %.1 %41 441 SE1BSUZ"E4FSWFS 7JEFP 3FXBSE 7JEFP"ET 1.1 0&.
  8. 34 なぜRuby及びRailsを選んだか? 会社立ち上げ当時(2006年)、開発機のOSはFreeBSD で、言語はさておき、よいORMを探していた。 Catalystだ!→ CPAN地獄にはまり挫折 PHPだ! → ORMがほぼなかった(当時) Javaだ!

    → PHPと同様 Rails? → インストール一発!AR最高! ということでRails(当時1.1)になりました ぶっちゃけたまたまですが、人にも異様に恵まれて とてもよい選択だったと思います。
  9. 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
  10. 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)
  11. 44 Yconbinator ポール・グラハムの言葉(その2) Beating The Averages(普通のやつらの上を行け 2001年) http://pactical-scheme.net/trans/beating-the-averages-j.html 私達のソフトウェアがユニークだったのは、それが主にLispと呼ばれ る

    プログラミング言語で書かれていたからだ。 (略)そして、パワー において劣る他の言語を使っている競争相手に対して、 Lispは強力な アドバンテージとなった。