Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Rust製の業務WebアプリケーションをRustでリプレイス_220428
Search
[email protected]
May 02, 2022
Technology
1.6k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Rust製の業務WebアプリケーションをRustでリプレイス_220428
[email protected]
May 02, 2022
More Decks by
[email protected]
See All by
[email protected]
製造業にRAGを導入する開発体制の変遷 / ManuAI1
caddi_eng
3
150
バラバラな見積明細と戦う話 / ManuAI2
caddi_eng
0
140
LLMに図面は読めるか – 製造業の「暗黙知」を突破するコンテキスト設計3つのアプローチ / LLMcontext
caddi_eng
1
290
「定型」を許さない製造業データへの挑戦 高度な絞り込みと意味検索を両立する実践 / ElasticON
caddi_eng
0
400
製造業ドメインにおける LLMプロダクト構築: 複雑な文脈へのアプローチ
caddi_eng
1
870
事業状況で変化する最適解。進化し続ける開発組織とアーキテクチャ
caddi_eng
1
17k
キャディでのApache Iceberg, Trino採用事例 -Apache Iceberg and Trino Usecase in CADDi--
caddi_eng
0
700
製造業の会計システムをDDDで開発した話
caddi_eng
3
2.4k
【CADDI VIETNAM】Company Deck for Engineers
caddi_eng
0
2.4k
Other Decks in Technology
See All in Technology
株式会社シーエーシー エンジニア向け会社紹介資料
cac
0
57k
薬剤師(ドメインエキスパート)と一緒に育てる薬局向けAIアシスタント
kakehashi
PRO
2
160
ASTを使って影響範囲を特定する
nealle
0
180
データ界隈LT祭 第1回LT登壇
taromatsui_cccmkhd
1
740
AI時代のAPI品質を支えるガードレール / API Guardrails for API quality in the AI era
yokawasa
1
220
DEFCON_CHV_CTF_Write-up.pdf
bata_24
0
140
アプリログインとWeb認証基盤をつなぐ ASWebAuthenticationSession 作法
shimastripe
1
260
Microsoft 365 Copilot chat -tekoälypalvelun tietosuojaongelmat
hponka
0
820
The Agent Builder Loop from Daily Work to OSS
minorun365
PRO
3
150
Claude Code本って、 読む必要あるの?
oikon48
2
430
「図書館」という名前のままでいいのか -Code4Lib JAPANカンファレンス2026 アンカンファレンス報告- / Code4Lib JAPAN Conference 2026: Unconference Report
ykiyota
0
170
AIを活用するために決めた "やらないこと" - 価値に注目する / Not betting on AI
soudai
PRO
1
370
Featured
See All Featured
Skip the Path - Find Your Career Trail
mkilby
1
230
30 Presentation Tips
portentint
PRO
1
390
AI Search: Where Are We & What Can We Do About It?
aleyda
0
7.9k
Why You Should Never Use an ORM
jnunemaker
PRO
61
10k
Rails Girls Zürich Keynote
gr2m
96
14k
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
440
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.6k
Bootstrapping a Software Product
garrettdimon
PRO
306
120k
For a Future-Friendly Web
brad_frost
183
10k
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
240
Code Review Best Practice
trishagee
74
20k
Darren the Foodie - Storyboard
khoart
PRO
3
3.9k
Transcript
A B O U T Rust製の業務Webアプリケーションを Rustでリプレイス
Yoshiki Matsuda 2 • バックエンドエンジニア @CADDi • キャディでは受発注業務アプリケーションをRust で開発 •
前職ではGoでバックエンド開発 • 開発環境 ◦ Neovim ◦ wezterm ◦ Arch Linux
3 今日お話しするプロダクト サプライチェーンの 可視化 発注先パートナーの選定 ※ リプレイス前の画面です
なぜリプレイスするのか? 4 • 「多品種少量・受注生産」のみならず「中量産・見込 み生産」へとビジネスが拡張 BOM (部品表) 製品 製品 製品
製品 見積 受注 発注 発注 案件 製品 製品 製品 発注 発注 案件 製品 製品 製品 発注 発注
既存コードベースの拡張ではダメだった? 5 • 既存コードベースの拡張でも、対応できなくはなかった ◦ Entity間の関係性を全面的に見直す必要がある • 工数を考えると、リプレイスしたほうが得と判断 ◦ 互換性確保のために工数を割く必要がない
◦ 現在のビジネスモデルを前提に最適な設計ができる ◦ ついでに技術的負債も返済できる • 社外ユーザー様が関わる部分のみ互換性を確保
6 リプレイスの全体像
リプレイスの方針 7 • YAGNI(You Ain’t Gonna Need It)を重視 ◦ 早すぎる抽象化・最適化を避ける
• 学習コストの削減 ◦ 一貫性のある規約によってコードベースを構築 ◦ ドメインロジックに集中できる状態 • テスタビリティの向上 ◦ 外部I/Oはすべてモック化可能な設計に ◦ 結合テストも自動化する
全体アーキテクチャ 8 マイクロサービスはコンテキスト単位で分割 - BOM(部品表) - 見積 - 受注 -
発注 - サプライチェーン設計 - 取引先情報 - ユーザ情報 - etc… DBは将来的に分割できるよう マイクロサービスごとに スキーマを分けて運用 マイクロサービス群の外側の他サービスとは Cloud Pub/Subで連携 (gRPCを同期的に叩いているケースもあり) マイクロサービス間はgRPC APIで 同期的に通信 コンポーネント横断での開発を促進す るため、リプレイス対象のマイクロ サービス群の開発言語はRustに統一
なぜRust? 9 • 型の表現力の高さと堅牢性 ◦ Option / Result ◦ パターンマッチ
◦ trait • キャディでは最も利用経験者の多い言語 ◦ 現状もRustなので当たり前ではあるのですが…… ◦ チーム間の人員流動性を確保できる • 社内に蓄積された知見を利用できる
Rustへの懸念 10 • 新規メンバーの学習コストが大きいのでは? ◦ 他の言語でも、言語未経験の新規メンバーに一定の学習コストが発生 するのは同じ ◦ これまでに入社したRust未経験メンバーも無事にキャッチアップでき ている
• 外部SDKが提供されない等で困るケースが発生する のでは? ◦ これまでの経験上、大きな問題は生じていない ◦ 仮にそのようなケースが発生した場合、外部SDKに依存するマイクロ サービスのみ別の言語で開発する選択肢もある
11 リプレイスのポイント
Monorepo 12 • UI / BFF / Microservices を単一のGitHub Repositoryに共存
させるモノレポ構成を導入 ◦ Repository間の移動によるコンテキストスイッチを軽減 ◦ path-filteringにより、変更されたファイルのパスに応じてCIを制御 • マイクロサービスの雛形を自動生成するスクリプトを用意 ◦ 自動生成→CIに組み込むだけで開発環境にサーバーが立ち上がる ディレクトリ構成 ./ - .circleci - proto - rust - common - service-a - service-b - service-c - typescript - apps - ui - bff
Clean Architecture 13 • ドメインロジックはDomain層に集約 • Infra層に対してはtraitを経由して依存する Domain Usecase Infra
Repository Trait Repository Impl ディレクトリ構成 service-a - app - domain - usecase - infra - db_dto - repository_impl - grpc - grpc_handler - grpc_convert - common - external_libs - error
ドメイン駆動設計 14 • 境界付けられたコンテキストの内側に集約を定義 ◦ 集約は1つまたは複数のエンティティから構成される • データの更新は必ず集約単位で行う ◦ それぞれの集約は、集約内部のデータの不変条件を担保
BOM(部品表)コンテキスト 集約 集約 見積コンテキスト 集約 集約 受注コンテキスト 集約 集約 発注コンテキスト 集約 集約
crateを細分化 15 • crateは他の言語でいうパッケージやモジュールに相当 • 1つのマイクロサービスの内部を多数の小さなcrateに分割 ◦ ビルド時間短縮による開発者体験の向上 ◦ リプレイス前は一部のcrateが肥大化し、ビルド時間のボトルネッ
クとなっていた Domain Usecase A Usecase B gRPC Handler A Repository A Repository B App (Entrypoint) gRPC Handler B
テスタビリティ向上 16 • mockallクレートでRepositoryのtraitをモック化し て単体テスト ◦ リプレイス前は、データベースI/Oに独自の社内ライブラリを利用 していた関係で、Usecase層のテストが書きづらかった • 結合テストのコードもRustで書いている
◦ gRPCリクエストを飛ばすテストコード専用のcrateを定義 ◦ cargo testで走らせる
苦労していること 17 • ドメインモデリング ◦ 事業規模拡大により、案件担当者、検品拠点スタッフ、会計担当者 など、ユーザーごとのニーズの多様性が増大 ◦ 見込み発注、在庫引当、装置一式組立…… •
マイクロサービス ◦ サービス間通信、分散トレーシング、サービスメッシュ…… • テスト・QA ◦ Rustの型の厳しさの代償として、テストコードを書くコストが重い ◦ UIまで含めたe2eテストも自動化したいが、まだ手つかず
18 おわりに
We are hiring! 19 • 以下のような方、一緒に開発しませんか? ◦ 複雑な業務ドメインのモデリングが好きな方 ◦ 高速で変化するビジネスモデルに対応できる柔軟なソフトウェア
アーキテクチャを探求したい方 ◦ モダンな技術をフル活用して事業価値を実現したい方 • ぜひカジュアルにお話ししましょう ◦ ご応募はこちらから: https://corp.caddi.jp/recruit/eng