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
190
バラバラな見積明細と戦う話 / ManuAI2
caddi_eng
0
160
LLMに図面は読めるか – 製造業の「暗黙知」を突破するコンテキスト設計3つのアプローチ / LLMcontext
caddi_eng
1
330
「定型」を許さない製造業データへの挑戦 高度な絞り込みと意味検索を両立する実践 / ElasticON
caddi_eng
0
450
製造業ドメインにおける LLMプロダクト構築: 複雑な文脈へのアプローチ
caddi_eng
1
900
事業状況で変化する最適解。進化し続ける開発組織とアーキテクチャ
caddi_eng
1
17k
キャディでのApache Iceberg, Trino採用事例 -Apache Iceberg and Trino Usecase in CADDi--
caddi_eng
0
730
製造業の会計システムをDDDで開発した話
caddi_eng
3
2.5k
【CADDI VIETNAM】Company Deck for Engineers
caddi_eng
0
2.4k
Other Decks in Technology
See All in Technology
HolmesGPTで始めるSREエージェント入門!プラットフォームの障害調査はAIにお任せ 〜
sanghyuk
0
250
10年欲しかった音楽管理アプリを、AIと一緒に作りはじめた
judau
1
200
BedrockとLambdaで作る リアルタイム進行型推理ゲーム
kawametho
0
160
大阪オフィスに Unitree Go2 がやってきたので Physical AI やってみた
dafujii
0
230
The kernel report
ennael
PRO
1
190
Lambda MicroVMsが分からなすぎたので使い所を1から考えてみた
tsukuboshi
2
290
認知負荷を吸収し、プロダクトをまたぐPR Preview基盤の設計事例
taiki45
2
570
LLM機能を自作して分かるSnowflake Cortex AIの強み
nayuts
0
180
「とりあえず動く」の先へ。 AI時代のチーム開発と内部設計/2026-slsdays
slsops
0
110
AI駆動開発、viviONの1年 ── うまくいったこと・いかなかったこと
vivion
0
140
形式手法を使って仕様をコーディングしよう
mikanichinose
0
160
Lambda MicroVMsは常駐サーバーの代わりに なるか? Kiro Crew を動かして検証してみた / Kiro Crew on Lambda MicroVMs
k_adachi_01
2
350
Featured
See All Featured
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.9k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
3
3.8k
Navigating Weather and Climate Data
rabernat
0
540
Designing for humans not robots
tammielis
254
26k
Building the Perfect Custom Keyboard
takai
2
890
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.3k
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
380
Designing Powerful Visuals for Engaging Learning
tmiket
1
590
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
1
620
The Pragmatic Product Professional
lauravandoore
37
7.5k
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.7k
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
500
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