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. Rust、何もわからない... #7
    マップボックス・ジャパン合同会社
    Software Engineer - yukinarit
    Rustで高速な広告配信サー
    ビスを作っている話

    View Slide

  2. Index
    目次
    01
    02
    03
    04
    05
    Mapbox
    Mapbox Ads Platform
    なぜRustで作るのか
    広告配信サービスのアーキテクチャ
    Rust採用してどうだった?

    View Slide

  3. 経歴
    地図会社 カーナビ / 経路探索Webサービス
    ゲーム会社 MMORPGゲームサーバ
    証券会社 Market Data / 先物オプション取引
    Mapbox 広告配信プラットフォーム
    yukinarit
    00
    3
    zenn.dev/yukinarit github.com/yukinarit

    View Slide

  4. 社名
    代表者
    設立年
    従業員数
    拠点
    Mapbox Inc.
    ピーター・シロタ
    2010年
    約700名
    クリエイターと
    エンジニアのための
    地図開発プラットフォーム
    4
    主要8都市:ワシントン DC本社 / サンフランシスコ(米国) /
    ヘルシンキ(フィンランド) / ミンスク(ベラルーシ) / シンガ
    ポール / 上海 / 北京(中国) / 東京(日本)
    https://www.mapbox.com/
    334M USD / 評価額1,000億円超
    Web
    累計調達額
    エンジニア中心文化
    グローバル700人以上の従業員のうち過半がエンジニア
    Mapbox Inc. 会社概要
    技術系ユニコーン企業
    評価額1,000億円超ソフトバンク・ビジョン・ファンドの出資
    Mapbox Inc.

    View Slide

  5. 最高の地図UX実現支援を
    通じて地図ビジネスの成功を支援
    5
    マップボックス・ジャパン会社概要
    会社概要
    社名
    代表者
    所在地
    事業内容
    Web
    出資者
    マップボックス・ジャパン合同会社
    高田 徹
    東京都港区虎ノ門 1-10-5 WeWork内
    地図開発プラットフォーム等の提供
    https://www.mapbox.com/
    地図開発プラットフォーム事業
    地図広告プラットフォーム事業
    Mapboxの既存プロダクト・サービスIT、通信、製造、金融、運輸、政府などの広
    範な業界がターゲット
    地図を活用した広告PFを展開。
    地図メディアや広告出稿主にとっての収益化
    を支援するプラットフォームをご提供
    5

    View Slide

  6. Mapbox Ads Platform
    02
    6
    ● 広告主のデザインしたアイコンを表示
    ● ユーザーのクリックにより、広告カードを表示する
    ○ 店舗基本情報表示
    ○ URLや電話番号、店舗へのルート等のCTA
    (Call-to-action)を設定可
    広告主のビジネス情報を地図上に表示する
    プロモーテッド・ピン
    https://www.mapbox.jp/ads

    View Slide

  7. なぜRustでつくるのか
    03
    7
    実は、一番最初(1、2ヶ月程)はGoで書
    かれていました。
    が、Rustで書き直しました。
    ※Goでダメという訳では全くありません。
    技術要件、メンバーのスキルセット等を勘案してRustに移行しました。

    View Slide

  8. なぜRustでつくるのか
    03
    8
    以下のバランスが優れている
    安全性 - Safety
    性能 - Performance 生産性 - Productivity
    汎用性 - Versatility 人気 - Popularity

    View Slide

  9. なぜRustでつくるのか
    03
    9
    安全性 - Safety
    Q. なぜコンパイルエラーになるか分かりますか?
    let mut list = vec![0, 1, 2, 3];
    let a = &mut list[0];
    list.push(4);
    *a = 10;

    View Slide

  10. なぜ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参照になる

    View Slide

  11. なぜ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できない
    この手のコードレビューでも気づかないバグをコンパイラが教えて
    くれるのでプログラマは気にする必要がない

    View Slide

  12. なぜ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を使いたいハイレベルな人材を採用できる

    View Slide

  13. 元C++プログラマがRustを始めたきっかけ
    03
    13
    上司 >> 性能に問題があるWebAPIを作り直してほしい
    同僚A >> Rustっていう言語最高だから使ってみない?
    2017年12月
    yukinarit >> C++でWebAPI作るの辛いしな.. Rustやってみるか

    View Slide

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

    View Slide

  15. 元C++プログラマがRustを始めたきっかけ
    03
    15
    3ヶ月後
    yukinarit >> cargo最高 / モジュール最高 / libtest最高
    serde最高 / structopt最高 / iterator最高
    enum最高 / Result最高
    もう全部Rustで作ればいいんじゃね?😂
    以降、5年間以上Rustでシステムを作り続けています。
    Rustified

    View Slide

  16. 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

    View Slide

  17. 広告配信サービスのアーキテクチャ
    04
    17
    地タイル毎に広告サーバにリクエストする。
    広告サーバは秒間何万ものリクエストを50msec以
    内のレイテンシーで返さないといけない。

    View Slide

  18. 広告配信サービスのアーキテクチャ
    04
    18
    ● 3つのマイクロサービス
    ● 広告サーバは単純なCRUDサーバではない
    ○ 広告オークション, A/Bテスト
    ● 広告サーバは広告設定を全てオンメモリに持っている
    ○ 広告DB、オークションDBとは非同期にデータ同期する
    ○ リクエスト中にはI/Oは発生しない
    ● ActixWebからgRPCへ移行中
    ● AWS: EKS / Aurora / MemoryDB for Redis

    View Slide

  19. 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で書かれた広告サーバを早くする

    View Slide

  20. Rust採用してどうだった?
    05
    20
    Rustで書かれたプログラム、本当に落ちないの?
    5年間、前職と含めて6~7個サービスをリリースしましたが、OOMとかを除いて本番で
    panicしたことないです😏

    View Slide

  21. Rust採用してどうだった?
    05
    21
    Rustで書かれたプログラム、本当に落ちないの?
    5年間、前職と含めて6~7個サービスをリリースしましたが、OOMとかを除いて本番で
    panicしたことないです😏
    すみません、前職の時1回だけありました...
    from_ymd昔はdeprecatedじゃなかったので、同僚が使って本番で落ちました😭

    View Slide

  22. 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

    View Slide

  23. Rust採用してどうだった?
    05
    23
    エコシステムの成熟度
    ● 必要なものは大体あるが…
    ○ AWS SDK for Rustはそろそろリリースされてほしい
    ● ニッチなライブラリはGoとかと比べて少ないと感じる
    ○ じゃあ、自分達で作ってOSSで公開したらいい
    動画広告VASTプロトコルのserde
    ベースのパーサー
    python-holidaysベースの休日情報
    を提供するライブラリ

    View Slide

  24. Rust採用してどうだった?
    05
    24
    総合して
    ● 生産性が非常に高い
    ○ ツールチェインを時間かけなくてもいい
    ○ 堅牢な型システムによる安心感
    ○ 安心だからできる大胆な設計
    ○ 超強力な言語機能, ライブラリ
    ● とてもとてもとても満足しています

    View Slide

  25. #Buildwithmapbox

    View Slide