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

How we build Ads Platform in Rust

How we build Ads Platform in Rust

2023年3月15日に開催された「Rust、何もわからない... #7」イベントでの登壇資料です。
https://estie.connpass.com/event/275423/

Mapbox Japan

March 16, 2023
Tweet

More Decks by Mapbox Japan

Other Decks in Technology

Transcript

  1. Index 目次 01 02 03 04 05 Mapbox Mapbox Ads

    Platform なぜRustで作るのか 広告配信サービスのアーキテクチャ Rust採用してどうだった?
  2. 経歴 地図会社 カーナビ / 経路探索Webサービス ゲーム会社 MMORPGゲームサーバ 証券会社 Market Data

    / 先物オプション取引 Mapbox 広告配信プラットフォーム yukinarit 00 3 zenn.dev/yukinarit github.com/yukinarit
  3. 社名 代表者 設立年 従業員数 拠点 Mapbox Inc. ピーター・シロタ 2010年 約700名

    クリエイターと エンジニアのための 地図開発プラットフォーム 4 主要8都市:ワシントン DC本社 / サンフランシスコ(米国) / ヘルシンキ(フィンランド) / ミンスク(ベラルーシ) / シンガ ポール / 上海 / 北京(中国) / 東京(日本) https://www.mapbox.com/ 334M USD / 評価額1,000億円超 Web 累計調達額 エンジニア中心文化 グローバル700人以上の従業員のうち過半がエンジニア Mapbox Inc. 会社概要 技術系ユニコーン企業 評価額1,000億円超ソフトバンク・ビジョン・ファンドの出資 Mapbox Inc.
  4. 最高の地図UX実現支援を 通じて地図ビジネスの成功を支援 5 マップボックス・ジャパン会社概要 会社概要 社名 代表者 所在地 事業内容 Web

    出資者 マップボックス・ジャパン合同会社 高田 徹 東京都港区虎ノ門 1-10-5 WeWork内 地図開発プラットフォーム等の提供 https://www.mapbox.com/ 地図開発プラットフォーム事業 地図広告プラットフォーム事業 Mapboxの既存プロダクト・サービスIT、通信、製造、金融、運輸、政府などの広 範な業界がターゲット 地図を活用した広告PFを展開。 地図メディアや広告出稿主にとっての収益化 を支援するプラットフォームをご提供 5
  5. Mapbox Ads Platform 02 6 • 広告主のデザインしたアイコンを表示 • ユーザーのクリックにより、広告カードを表示する ◦

    店舗基本情報表示 ◦ URLや電話番号、店舗へのルート等のCTA (Call-to-action)を設定可 広告主のビジネス情報を地図上に表示する プロモーテッド・ピン https://www.mapbox.jp/ads
  6. なぜRustでつくるのか 03 10 安全性 - Safety let mut list =

    vec![0, 1, 2, 3]; let a = &mut list[0]; list.push(4); *a = 10; A. vecのmutable参照が2つあるから // vecのresizeが発生する可能性がある 参考: Why can’t I have more than one mutable reference to a value? https://users.rust-lang.org/t/why-cant-i-have-more-than-one-mutable-reference-to-a-value/29773/8 // resizeが起こるとaがdangling参照になる
  7. なぜRustでつくるのか 03 11 安全性 - Safety Q. なぜコンパイルエラーになるか分かりますか? let mut

    list = vec![0, 1, 2, 3]; let th = std::thread::spawn(|| list.push(4)); println!("{list:?}"); th.join().unwrap(); // vecの参照をthread内でcaptureできない この手のコードレビューでも気づかないバグをコンパイラが教えて くれるのでプログラマは気にする必要がない
  8. なぜRustでつくるのか 03 性能 - Performance 生産性 - Productivity 汎用性 -

    Versatility 人気 - Popularity C/C++に匹敵する性能 Battery Included / 出来の良いツールチェイン / 高品質なライブ ラリ達 (serde, anyhow, actix-web, tokio etc.) CLI, Web API, TCP/UDPサーバ, フロントエンド(WASM), 他言語のバックエンド(e.g. pydantic)、組み込み、カーネル Rustを使いたいハイレベルな人材を採用できる
  9. 元C++プログラマがRustを始めたきっかけ 03 14 3ヶ月後 yukinarit >> cargo最高 / モジュール最高 /

    libtest最高 serde最高 / structopt最高 / iterator最高 enum最高 / Result最高 もう全部Rustで作ればいいんじゃね?😂
  10. 元C++プログラマがRustを始めたきっかけ 03 15 3ヶ月後 yukinarit >> cargo最高 / モジュール最高 /

    libtest最高 serde最高 / structopt最高 / iterator最高 enum最高 / Result最高 もう全部Rustで作ればいいんじゃね?😂 以降、5年間以上Rustでシステムを作り続けています。 Rustified
  11. serde好きすぎて.. 03 16 Pythonで使えるserdeのようなライブラリ作ってます @serde(rename_all=”constcase”) @dataclass class Foo: a: int

    b: list[Bar] c: dist[str, Path] = field(skip_if_false=True) d: Bar = field(flatten=True) >>> f = Foo(1, [Bar(2)], {}, Bar(3)) >>> print(to_json(f)) {"A":1,"B":[{"v":2}],"V":3} • JSON, YAML, TOML, MsgPack, Pickle • Optional, Union, Generic, ClassVar etc. • pathlib.Path, Decimal, UUID etc. • Some numpy types • rename, skip_if, alias • Field & Class level custom (de)serializer • flatten
  12. 広告配信サービスのアーキテクチャ 04 18 • 3つのマイクロサービス • 広告サーバは単純なCRUDサーバではない ◦ 広告オークション, A/Bテスト

    • 広告サーバは広告設定を全てオンメモリに持っている ◦ 広告DB、オークションDBとは非同期にデータ同期する ◦ リクエスト中にはI/Oは発生しない • ActixWebからgRPCへ移行中 • AWS: EKS / Aurora / MemoryDB for Redis
  13. Rust採用してどうだった? 05 19 性能面 • k8sのCA/HPAとRustの組み合わせで、頭打ちなくスケールアウトしていく ◦ GCが無いのでリソースの予測がしやすい ◦ Nodeのスケールアウトと共に、ほぼリニアにスループットが上がっていく

    ◦ リクエストを処理するのにI/Oが発生しないので、DBがボトルネックにならない • プログラムの性能解析 ◦ bheisler/criterion-rs ◦ framegraph-rs/framegraph • PGO (Profile Guided Optimization)で速度UP 🏎PGOでRustで書かれた広告サーバを早くする
  14. Rust採用してどうだった? 05 22 大変だったこと (2017 ~ 2019) • async/await前はFutureが大変だった ◦

    map, map_err地獄 ◦ 小難しいことする時pollを実装することがあったが、難易度が高かった • tokio 0.2系からtokio 1系へのMigration ◦ 自社RPCフレームワーク、たくさんの社内ライブラリ • エラーハンドリングのベストプラクティスが分からなかった • RocketにHTTP KeepAliveが動かないバグがあった ◦ TCPプロキシを自作してKeepAliveできるようにした asyn/awaitの登場 tokio 1で安定している anyhow/thiserrorの登場 actix-web / axum等の alternativesの登場 🦀 Rust/AnyhowのTips
  15. Rust採用してどうだった? 05 23 エコシステムの成熟度 • 必要なものは大体あるが… ◦ AWS SDK for

    Rustはそろそろリリースされてほしい • ニッチなライブラリはGoとかと比べて少ないと感じる ◦ じゃあ、自分達で作ってOSSで公開したらいい 動画広告VASTプロトコルのserde ベースのパーサー python-holidaysベースの休日情報 を提供するライブラリ
  16. Rust採用してどうだった? 05 24 総合して • 生産性が非常に高い ◦ ツールチェインを時間かけなくてもいい ◦ 堅牢な型システムによる安心感

    ◦ 安心だからできる大胆な設計 ◦ 超強力な言語機能, ライブラリ • とてもとてもとても満足しています