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
Rust製の業務WebアプリケーションをRustでリプレイス_220428
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
[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
1
95
バラバラな見積明細と戦う話 / ManuAI2
caddi_eng
0
93
LLMに図面は読めるか – 製造業の「暗黙知」を突破するコンテキスト設計3つのアプローチ / LLMcontext
caddi_eng
1
200
「定型」を許さない製造業データへの挑戦 高度な絞り込みと意味検索を両立する実践 / ElasticON
caddi_eng
0
210
製造業ドメインにおける LLMプロダクト構築: 複雑な文脈へのアプローチ
caddi_eng
1
780
事業状況で変化する最適解。進化し続ける開発組織とアーキテクチャ
caddi_eng
1
16k
キャディでのApache Iceberg, Trino採用事例 -Apache Iceberg and Trino Usecase in CADDi--
caddi_eng
0
650
製造業の会計システムをDDDで開発した話
caddi_eng
3
2.4k
【CADDI VIETNAM】Company Deck for Engineers
caddi_eng
0
2.2k
Other Decks in Technology
See All in Technology
はてなのサービス基盤を支える Kubernetes《足腰》
masayoshimaezawa
0
390
認証認可だけじゃない! ID管理の構成要素と ライフサイクルを意識しよう
ritou
1
430
Zenoh on Zephyr on LiteX
takasehideki
2
160
打造你的 AI 工作流:Agent Skill + MCP 實戰工作坊
appleboy
0
310
デジタル・デザイン:次の50年を描く「進化する青写真」
y150saya
0
720
BPaaSで進むAIオペレーションの現在地 AI実装が効く領域とスケーラビリティの選定と実装
kentarofujii
0
240
AI時代における最適なQA組織の作り方
ymty
3
320
アラート調査向けAIエージェントの本番導入とその後/AI Agents for Alert Investigation: Production Deployment and After
taddy_919
1
310
#エンジニアBooks 30分でわかる 「技術記事を書く技術」 / engineer-books 2026-06-30
jnchito
1
160
Text-to-SQLをAgentCoreで実現し、生成されるSQLの精度を定量的に評価する
yakumo
2
320
Oracle Exadata Database Service on Cloud@Customer X11M (ExaDB-C@C) サービス概要
oracle4engineer
PRO
2
8.3k
AIで政治は変わるのか? — 中高生と考えたAI時代の民主主義(東海高校サタデープログラム)
eitarosuda
0
340
Featured
See All Featured
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
170
Bash Introduction
62gerente
615
220k
The SEO Collaboration Effect
kristinabergwall1
1
500
Art, The Web, and Tiny UX
lynnandtonic
304
22k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.5k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
230
23k
Typedesign – Prime Four
hannesfritz
42
3.1k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.8k
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.3k
Building Adaptive Systems
keathley
44
3.1k
Statistics for Hackers
jakevdp
799
230k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
49
10k
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