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
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.3k
一休.comレストランのRustバックエンド開発の様子
kymmt90
15
12k
レガシーWebアプリケーションの性能とコードの健全性をインクリメンタルに改善する / pepabotech-20211209
kymmt90
1
3k
コードレビュー座学 / About code reviews
kymmt90
0
6.7k
ペパボのWebサービス 開発スタイル / Web services development at GMO Pepabo
kymmt90
2
600
GraphQL and Schema-First Development
kymmt90
4
4k
EC新サービスにおけるスキーマファースト開発 / Schema First Development in the New EC Service
kymmt90
1
2.3k
rails new --api してからやったこと 〜2017年・夏〜 / EC Tech MTG 3
kymmt90
0
850
カテゴリ階層の拡張を目的とした階層的トピックモデル / A hierarchical topic model for expanding category hierarchies
kymmt90
0
540
Other Decks in Technology
See All in Technology
C# 14 / .NET 10 の新機能 (RC 1 時点)
nenonaninu
1
1.5k
BirdCLEF+2025 Noir 5位解法紹介
myso
0
190
コンテキストエンジニアリングとは? 考え方と応用方法
findy_eventslides
4
870
OCI Network Firewall 概要
oracle4engineer
PRO
1
7.8k
AI時代だからこそ考える、僕らが本当につくりたいスクラムチーム / A Scrum Team we really want to create in this AI era
takaking22
6
3k
成長自己責任時代のあるきかた/How to navigate the era of personal responsibility for growth
kwappa
3
250
非エンジニアのあなたもできる&もうやってる!コンテキストエンジニアリング
findy_eventslides
3
890
PythonとLLMで挑む、 4コマ漫画の構造化データ化
esuji5
1
130
SOC2取得の全体像
shonansurvivors
1
350
KAGのLT会 #8 - 東京リージョンでGAしたAmazon Q in QuickSightを使って、報告用の資料を作ってみた
0air
0
200
Flaky Testへの現実解をGoのプロポーザルから考える | Go Conference 2025
upamune
1
400
Sidekiq その前に:Webアプリケーションにおける非同期ジョブ設計原則
morihirok
17
7.2k
Featured
See All Featured
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
32
2.2k
Building a Modern Day E-commerce SEO Strategy
aleyda
43
7.7k
Build your cross-platform service in a week with App Engine
jlugia
232
18k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
15
1.7k
Stop Working from a Prison Cell
hatefulcrawdad
271
21k
The World Runs on Bad Software
bkeepers
PRO
71
11k
Navigating Team Friction
lara
189
15k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.2k
Raft: Consensus for Rubyists
vanstee
139
7.1k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
30
2.9k
Designing for Performance
lara
610
69k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
45
2.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