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
870
一休.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.1k
一休.comレストランのRustバックエンド開発の様子
kymmt90
14
11k
レガシーWebアプリケーションの性能とコードの健全性をインクリメンタルに改善する / pepabotech-20211209
kymmt90
1
2.5k
コードレビュー座学 / About code reviews
kymmt90
0
6.6k
ペパボのWebサービス 開発スタイル / Web services development at GMO Pepabo
kymmt90
2
570
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
770
カテゴリ階層の拡張を目的とした階層的トピックモデル / A hierarchical topic model for expanding category hierarchies
kymmt90
0
460
Other Decks in Technology
See All in Technology
JAWS DAYS 2025 アーキテクチャ道場 事前説明会 / JAWS DAYS 2025 briefing document
naospon
0
150
NFV基盤のOpenStack更新 ~9世代バージョンアップへの挑戦~
vtj
0
360
Change Managerを活用して本番環境へのセキュアなGUIアクセスを統制する / Control Secure GUI Access to the Production Environment with Change Manager
yuj1osm
0
100
AWSを活用したIoTにおけるセキュリティ対策のご紹介
kwskyk
0
400
エンジニアリング価値を黒字化する バリューベース戦略を用いた 技術戦略策定の道のり
kzkmaeda
7
2.9k
AIエージェント時代のエンジニアになろう #jawsug #jawsdays2025 / 20250301 Agentic AI Engineering
yoshidashingo
8
3.8k
スキルだけでは満たせない、 “組織全体に”なじむオンボーディング/Onboarding that fits “throughout the organization” and cannot be satisfied by skills alone
bitkey
0
190
開発組織を進化させる!AWSで実践するチームトポロジー
iwamot
2
430
技術スタックだけじゃない、業務ドメイン知識のオンボーディングも同じくらいの量が必要な話
niftycorp
PRO
0
110
エンジニア主導の企画立案を可能にする組織とは?
recruitengineers
PRO
1
140
手を動かしてレベルアップしよう!
maruto
0
230
データエンジニアリング領域におけるDuckDBのユースケース
chanyou0311
9
2.2k
Featured
See All Featured
For a Future-Friendly Web
brad_frost
176
9.6k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
330
21k
StorybookのUI Testing Handbookを読んだ
zakiyama
28
5.5k
Navigating Team Friction
lara
183
15k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
47
5.2k
How STYLIGHT went responsive
nonsquared
98
5.4k
Into the Great Unknown - MozCon
thekraken
35
1.6k
VelocityConf: Rendering Performance Case Studies
addyosmani
328
24k
Building Better People: How to give real-time feedback that sticks.
wjessup
367
19k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
12
990
Writing Fast Ruby
sferik
628
61k
Music & Morning Musume
bryan
46
6.4k
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