Lock in $30 Savings on PRO—Offer Ends Soon! ⏳
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
1.1k
一休.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
3.4k
一休.comレストランのRustバックエンド開発の様子
kymmt90
15
12k
レガシーWebアプリケーションの性能とコードの健全性をインクリメンタルに改善する / pepabotech-20211209
kymmt90
1
3k
コードレビュー座学 / About code reviews
kymmt90
0
6.8k
ペパボのWebサービス 開発スタイル / Web services development at GMO Pepabo
kymmt90
2
610
GraphQL and Schema-First Development
kymmt90
4
4k
EC新サービスにおけるスキーマファースト開発 / Schema First Development in the New EC Service
kymmt90
1
2.4k
rails new --api してからやったこと 〜2017年・夏〜 / EC Tech MTG 3
kymmt90
0
880
カテゴリ階層の拡張を目的とした階層的トピックモデル / A hierarchical topic model for expanding category hierarchies
kymmt90
0
570
Other Decks in Technology
See All in Technology
AI との良い付き合い方を僕らは誰も知らない
asei
0
230
AIエージェント開発と活用を加速するワークフロー自動生成への挑戦
shibuiwilliam
4
810
20251219 OpenIDファウンデーション・ジャパン紹介 / OpenID Foundation Japan Intro
oidfj
0
410
20251203_AIxIoTビジネス共創ラボ_第4回勉強会_BP山崎.pdf
iotcomjpadmin
0
120
通勤手当申請チェックエージェント開発のリアル
whisaiyo
3
370
New Relic 1 年生の振り返りと Cloud Cost Intelligence について #NRUG
play_inc
0
200
日本の AI 開発と世界の潮流 / GenAI Development in Japan
hariby
1
200
【U/Day Tokyo 2025】Cygames流 最新スマートフォンゲームの技術設計 〜『Shadowverse: Worlds Beyond』におけるアーキテクチャ再設計の挑戦~
cygames
PRO
2
1.3k
2025-12-18_AI駆動開発推進プロジェクト運営について / AIDD-Promotion project management
yayoi_dd
0
150
ZOZOの独自性を生み出す「似合う4大要素」の開発サイクル
zozotech
PRO
0
120
会社紹介資料 / Sansan Company Profile
sansan33
PRO
11
390k
1人1サービス開発しているチームでのClaudeCodeの使い方
noayaoshiro
2
570
Featured
See All Featured
Leadership Guide Workshop - DevTernity 2021
reverentgeek
0
160
Why Our Code Smells
bkeepers
PRO
340
57k
Why You Should Never Use an ORM
jnunemaker
PRO
61
9.7k
Amusing Abliteration
ianozsvald
0
69
Test your architecture with Archunit
thirion
1
2.1k
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
47
33k
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
90
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
61k
Getting science done with accelerated Python computing platforms
jacobtomlinson
0
76
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
48
9.8k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
1.8k
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