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
850
一休.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
450
Other Decks in Technology
See All in Technology
Goで作って学ぶWebSocket
ryuichi1208
0
280
Building Products in the LLM Era
ymatsuwitter
10
5.4k
エンジニアのためのドキュメント力基礎講座〜構造化思考から始めよう〜(2025/02/15jbug広島#15発表資料)
yasuoyasuo
17
6.7k
現場の種を事業の芽にする - エンジニア主導のイノベーションを事業戦略に装着する方法 -
kzkmaeda
2
2.1k
関東Kaggler会LT: 人狼コンペとLLM量子化について
nejumi
3
580
データ資産をシームレスに伝達するためのイベント駆動型アーキテクチャ
kakehashi
PRO
2
530
Tech Blogを書きやすい環境づくり
lycorptech_jp
PRO
1
240
2/18/25: Java meets AI: Build LLM-Powered Apps with LangChain4j
edeandrea
PRO
0
120
7日間でハッキングをはじめる本をはじめてみませんか?_ITエンジニア本大賞2025
nomizone
2
1.8k
Amazon S3 Tablesと外部分析基盤連携について / Amazon S3 Tables and External Data Analytics Platform
nttcom
0
130
Classmethod AI Talks(CATs) #17 司会進行スライド(2025.02.19) / classmethod-ai-talks-aka-cats_moderator-slides_vol17_2025-02-19
shinyaa31
0
120
Developers Summit 2025 浅野卓也(13-B-7 LegalOn Technologies)
legalontechnologies
PRO
0
720
Featured
See All Featured
Dealing with People You Can't Stand - Big Design 2015
cassininazir
366
25k
jQuery: Nuts, Bolts and Bling
dougneiner
63
7.6k
Mobile First: as difficult as doing things right
swwweet
223
9.3k
Building a Modern Day E-commerce SEO Strategy
aleyda
38
7.1k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
49
2.3k
Fireside Chat
paigeccino
34
3.2k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
27
1.9k
We Have a Design System, Now What?
morganepeng
51
7.4k
A Modern Web Designer's Workflow
chriscoyier
693
190k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
129
19k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
248
1.3M
Reflections from 52 weeks, 52 projects
jeffersonlam
348
20k
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