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
一休.comレストランにおけるRustの活用
Search
Kōhei Yamamoto (山本浩平)
October 31, 2024
Technology
3
810
一休.comレストランにおけるRustの活用
2024-10-31 Findy Job LTで使用した資料です。
Kōhei Yamamoto (山本浩平)
October 31, 2024
Tweet
Share
More Decks by Kōhei Yamamoto (山本浩平)
See All by Kōhei Yamamoto (山本浩平)
総会員数1,500万人のレストランWeb予約サービスにおけるRustの活用
kymmt90
3
3k
一休.comレストランのRustバックエンド開発の様子
kymmt90
14
11k
レガシーWebアプリケーションの性能とコードの健全性をインクリメンタルに改善する / pepabotech-20211209
kymmt90
1
2.4k
コードレビュー座学 / About code reviews
kymmt90
0
6.5k
ペパボのWebサービス 開発スタイル / Web services development at GMO Pepabo
kymmt90
2
560
GraphQL and Schema-First Development
kymmt90
4
3.8k
EC新サービスにおけるスキーマファースト開発 / Schema First Development in the New EC Service
kymmt90
1
2.2k
rails new --api してからやったこと 〜2017年・夏〜 / EC Tech MTG 3
kymmt90
0
750
カテゴリ階層の拡張を目的とした階層的トピックモデル / A hierarchical topic model for expanding category hierarchies
kymmt90
0
440
Other Decks in Technology
See All in Technology
My small contributions - Fujiwara Tech Conference 2025
ijin
0
1.4k
いま現場PMのあなたが、 経営と向き合うPMになるために 必要なこと、腹をくくること
hiro93n
9
7.7k
あなたの人生も変わるかも?AWS認定2つで始まったウソみたいな話
iwamot
3
850
新卒1年目、はじめてのアプリケーションサーバー【IBM WebSphere Liberty】
ktgrryt
0
120
デジタルアイデンティティ人材育成推進ワーキンググループ 翻訳サブワーキンググループ 活動報告 / 20250114-OIDF-J-EduWG-TranslationSWG
oidfj
0
540
Azureの開発で辛いところ
re3turn
0
240
あなたの知らないクラフトビールの世界
miura55
0
130
Git scrapingで始める継続的なデータ追跡 / Git Scraping
ohbarye
5
490
dbtを中心にして組織のアジリティとガバナンスのトレードオンを考えてみた
gappy50
0
260
Building Scalable Backend Services with Firebase
wisdommatt
0
110
信頼されるためにやったこと、 やらなかったこと。/What we did to be trusted, What we did not do.
bitkey
PRO
0
2.2k
なぜfreeeはハブ・アンド・スポーク型の データメッシュアーキテクチャにチャレンジするのか?
shinichiro_joya
2
470
Featured
See All Featured
Embracing the Ebb and Flow
colly
84
4.5k
Six Lessons from altMBA
skipperchong
27
3.6k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
33
2.7k
Music & Morning Musume
bryan
46
6.3k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
132
33k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
3.6k
Optimizing for Happiness
mojombo
376
70k
A Tale of Four Properties
chriscoyier
157
23k
Rails Girls Zürich Keynote
gr2m
94
13k
Learning to Love Humans: Emotional Interface Design
aarron
274
40k
GraphQLの誤解/rethinking-graphql
sonatard
68
10k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
28
4.5k
Transcript
0 一休.comレストランにおける Rustの活用 2024-10-31 山本浩平 @ Findy Job LT
1 自己紹介 • 山本浩平 @kymmt90 • 2023年9月入社 • 一休.comレストランのプロダクト開発 兼
技術広報 • Rustバックエンド開発に途中から参画 • Rust歴は1年程度
2 本発表で話すこと • 一休.comレストランのRust移行の概要 • Rustバックエンドの技術的な詳細 • 今後の課題や求人中のポジションにおけるチャレンジ
3 一休.comレストラン | サービス概要 • 上質なレストランを対象 に、店舗や食事コースの 検索、詳細情報の閲覧、 Web予約を提供 •
2006年ローンチの長い 歴史を持つサービス
4 一休.comレストラン | Rustに移行中 • スマートフォンビューのバックエンドはRustに移行済み ◦ スマートフォンからの利用が多く、後述する 高速/省リソース化が狙いの1つ ◦
検索と詳細情報取得のためのGraphQL API ◦ 予約コアロジック (後述) へのリクエスト委譲
5 一休.comレストラン | Rustに移行中 • デスクトップビューのバックエンドもRustに移行中 • Solr (全文検索エンジン)のインデクサーもRustに移行中 •
Fastly ComputeでRustを用いたキャッシュロジックも 運用中 • 本日はバックエンドの技術的詳細に絞って説明します🙏
6 一休.comレストラン | 移行途中の旧システム • Python/Flask (現行デスクトップビューのバックエンド) • C# (一部APIサーバーやSolrのインデクサー)
• 運用面の課題や技術選定方針からRust移行へ
7 一休.comレストラン | 移行途中の旧システム • VBScript ◦ Windows Serverで動く、予約作成、変更、キャンセル などを担うシステムで、当初からある古いコード
◦ 後述する課題を抱えており、遅くとも2027年までに リプレースが必要
8 一休.comレストラン | 2024年現在は過渡期 • 最終的にはRustへの移行完了を目指している • 現状は複数の言語をまたいだ開発も ◦ Rustも書く
◦ プロジェクトの状況やビジネス要求に応じて Python/VBScript側を改修することもある
9 Rustバックエンド | 選定理由 • 社内技術選定方針「シンプル、かつすばやく、それでいて 堅牢に作れる」を意識しつつ、以下を狙った ◦ 表現力の高い型システムでドメインモデルをコード化 ◦
高速/省リソースなバックエンドサーバを実現し、 サービス運用コストを中長期的に改善
10 Rustバックエンド | 設計 • オニオンアーキテクチャ ◦ モデルはデータストアや 設定の詳細に非依存、 I/Fだけに依存
◦ 実際のデータストアや 設定値はサーバ起動時に 注入
11 Rustバックエンド | 設計 async fn fetch_restaurants<C: Config>( &self, database:
&crate::Database<C>, keys: &[RestaurantId], ) -> Result<HashMap<RestaurantId, Result<Restaurant>>> { let query = format!( // クエリ ); // レコードフェッチ、DTOからクエリモデルへ let restaurant_models = database .query_as::<dto::Restaurant>(&query, params) .await .context("failed to query restaurants")? .into_iter() .map(|d| (d.id, Restaurant::try_from(d))) .collect(); Ok(restaurant_models) } データアクセス層のコードのイメージ データストアや設定は外から注入 上位層→モデルの依存方向で モデルは外界に依存しない
12 Rustバックエンド | Cargo Workspace • Cargoを活用して1つのリポジトリの中をモジュラーに ◦ 各層(実際はもう少し細粒度)をworkspace crateで表現
◦ 各crateのCargo.tomlでcrate間の依存の向きを強制 # ルートディレクトリのCargo.toml [workspace] resolver = "2" members = [ "backend/*", ] [workspace.dependencies] backend-query-model = { path = "./backend/query-model" } # ...
13 Rustバックエンド | Cargo Workspace • workspace.dependenciesで設定した特定のcrateへの 依存をCargo.tomlに明記 # データアクセス層のCargo.toml
[package] name = "backend-data-access" version.workspace = true authors.workspace = true edition.workspace = true publish.workspace = true [dependencies] backend-query-model = { workspace = true }
14 Rustバックエンド | API • GraphQLとREST ◦ ユーザー向けフロントエンドはGraphQL ▪ フロントエンドでも型生成に利用
◦ 社内の他システムとの連携用エンドポイントはREST ◦ フレームワークはAxum、GraphQLはasync-graphqlを 利用
15 Rustバックエンド | ライブラリ • サービスの業務に直接関連しないロジックはライブラリ として分離 ◦ SQL ServerやRedis、クラウドサービスの
クライアントなど
16 Rustバックエンド | ライブラリ • 24時以降を表現できる時間型 のcrateもここに実装 ◦ 飲食店予約業務では必要 ◦
サービスに直接関係する ロジックではないので分離 /// 31:59:59 まで表現できる時刻型 #[derive(Clone, Copy, …))] pub struct Time24 { /// 00:00:00 からの経過秒数 secs: u32, } impl Time24 { ... } impl chrono::Timelike for Time24 { ... }
17 Rustバックエンド | デプロイ/運用 • GitHub Actionsでイメージ作成からデプロイまで自動化 • Google Cloud
Runで運用 ◦ トラフィックは最大1,000req/sほど(夕方〜夜が多い)
18 技術課題 | 中長期 • 予約コアロジックの移行 ◦ VBScriptは2027年ごろデフォルト無効化予定 https://techcommunity.microsoft.com/t5/windows-it-pro-blog/vbscript-deprecation-timelines-and-next-steps/ba-p/4148301
19 技術課題 | 中長期 • 予約コアロジックの移行 ◦ 新規予約、変更、キャンセル、割引やポイント付与を 含む既存のVBScriptからRustへの移行 ◦
Rustのコードとして、どうデータモデルを表現するか から取り組むことが求められる
20 エンジニアを募集しています • 本ポジションにおける技術的チャレンジ ◦ レガシーと向き合いつつ、予約コアロジックなどの Rustへの移行をスムーズに進めること ◦ 今後サービスを支えるRustコードベースを設計から コードまで健全な状態に保つこと
• Rust自体は未経験でも問題ありません
21 エンジニアを募集しています https://findy-code.io/companies/830