Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

#Buildwithmapbox