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
ZOZO基幹システムリプレイス ハイライト(2025年3月版) / zozo-backoff...
Search
takumi.okamoto
March 04, 2025
0
12
ZOZO基幹システムリプレイス ハイライト(2025年3月版) / zozo-backoffice-system-replacement-highlight-202503
2022年ごろから本格始動したZOZOの基幹システムリプレイスのハイライトを主に技術的な視点で紹介します。
takumi.okamoto
March 04, 2025
Tweet
Share
More Decks by takumi.okamoto
See All by takumi.okamoto
一歩ずつ成長しながら進める ZOZOの基幹システムリプレイス/Growing Stap by Stap ZOZO BackOffice System Replacement
cocet33000
2
260
ZOZO基幹システムリプレイスの歩み ~マイクロサービス?モジュラモノリス?~ / ZOZO BackOffice System Replacement Project History
cocet33000
1
330
Featured
See All Featured
Large-scale JavaScript Application Architecture
addyosmani
511
110k
How to Think Like a Performance Engineer
csswizardry
22
1.4k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
12k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
32
2.2k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Statistics for Hackers
jakevdp
797
220k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
28
1.9k
Building Applications with DynamoDB
mza
93
6.3k
How to train your dragon (web standard)
notwaldorf
91
5.9k
Site-Speed That Sticks
csswizardry
4
420
A Tale of Four Properties
chriscoyier
158
23k
Rails Girls Zürich Keynote
gr2m
94
13k
Transcript
ZOZO基幹システムリプレイス ハイライト(2025年3月版) 株式会社ZOZO 基幹システム本部 物流開発部 基幹リプレイスブロック 岡本拓実 Copyright ©
ZOZO, Inc. 1
© ZOZO, Inc. 株式会社ZOZO 基幹システム本部 物流開発部 基幹リプレイスブロック 岡本 拓実 2020年4月に株式会社ZOZOに新卒入社
レガシー環境での開発・運用を経て 現在はリプレイスプロジェクトに従事 趣味は不要不急の買い物で散財すること 2
© ZOZO, Inc. 3 今日話すこと • 2022年ごろから本格始動した基幹システムリプレイスのハイライト (特に重要なできごと)を主に技術的な視点で紹介します。
© ZOZO, Inc. 4 ①発送マイクロサービス化
© ZOZO, Inc. 5 発送マイクロサービス化 発送作業者 @ZOZOBASE 大きな泥団子 発送準 備
発送業 務 返金 在庫 注文 会計 入荷 顧客 商品 セール クーポン 分析 委託返却 抽選 コスメ レポート マスター 権限 注文 発送 準備 発送 業務 発送 完了 詳細は ZOZO TECH BLOG モノリスからマイクロサービスへ -ZOZOBASEを支える発送システムリプレイスの取り組み https://techblog.zozo.com/entry/replacing-shipping-system-supporting-zozobase 発送 業務 発送 マイクロサービスとして切り出す 発送に関わる機能
© ZOZO, Inc. 6 全体構成
© ZOZO, Inc. 7 全体構成 大きな泥 団子 発 送 準
備 発 送 業 務
© ZOZO, Inc. 8 使用技術 Aurora MySQL EKS EKS MSK
Cluster SQS VBScript Microsoft SQL Server MSK Connect DDD (Domain-Driven Design)
© ZOZO, Inc. 9 Outboxパターン+CDCで安全にイベントを発行する ここ
© ZOZO, Inc. 10 Outboxパターン+CDCで安全にイベントを発行する 詳細は ZOZO TECH BLOG Amazon
MSKを用いてMySQLに対してChange Data Captureを実現する https://techblog.zozo.com/entry/change-data-capture-for-mysql-using-amazon-msk Pick Aggregate picks pick_events UPDATE INSERT Transaction Outbox Table pickRepository.save(aggregate) Message Relay Message Broker Change Data Capture State Sourcing
© ZOZO, Inc. 11 Outboxパターン+CDCで安全にイベントを発行する 詳細は ZOZO TECH BLOG Amazon
MSKを用いてMySQLに対してChange Data Captureを実現する https://techblog.zozo.com/entry/change-data-capture-for-mysql-using-amazon-msk Pick Aggregate picks pick_events UPDATE INSERT Transaction Outbox Table pickRepository.save(aggregate) Message Relay Message Broker Change Data Capture State Sourcing Aurora MySQL EKS MSK Connect MSK Cluster
© ZOZO, Inc. 12 コマンド・クエリの分離戦略: Not CQRS, Yes CQS •
どちらも同じRDBを利用する。 ◦ 「コマンド側はNoSQL」といったインフラの最適化まではしない。 ◦ 今回はクエリ側までの反映ラグがシビアなシステム、開発メンバーにCQRS経験 もないので回避する。 • アプリケーションのモデルは完全に分離する。 ◦ コマンド側のモデルをクリーンに保つための工夫。 コマンド側とクエリ側で同じテーブルを利用していたが、コマンド優位なテーブル設計 だったこともあり、クエリ側で期待するパフォーマンスが出せなかった。 対策として一部クエリ専用のテーブルも作成して利用している。実装コストを鑑みて、イ ベントを経由せずにコマンド側処理の同一トランザクション内でコマンド用・クエリ用両 方のテーブルを更新している。
© ZOZO, Inc. 13 トランザクション戦略: 厳密に1集約1トランザクションにしない • DDDにおいては集約が更新の単位であり、複数の集約を同一トランザ クションで更新するのはスケーラビリティを維持するためにも避ける べき。
• ただしコストもかかる。発送サービスではアプリケーションコードの 設計は将来的な分離を強く意識しつつも、複数の集約を同一トランザ クションで更新することも許容する。 ◦ 現状ではパフォーマンス的にも問題は出ていない。論理的には分離しているの で将来に備えることもできている。良い選択だった。 ◦ (当時の集約設計が甘かった可能性もゼロではないがやれることはやった。)
© ZOZO, Inc. 14 ②モジュラーモノリス基盤への移行
© ZOZO, Inc. 15 モジュラーモノリス基盤へ安全に移行する ここ モジュラーモノリス基盤 大きな泥団子 (画面もベッタリ)
© ZOZO, Inc. 16 モジュラーモノリス基盤への移行方針 • 既存のトランザクション境界の見直しなど真の意味で泥団子を解きほ ぐすのは後回しにして、とにかくモジュラーモノリス基盤へと移行す る。 •
モノリスにはフロントエンドの実装も存在する。まずはバックエンド の実装を全てモジュラーモノリス基盤のAPI経由で呼び出す形を目指 す。 • 基本的にインフラレイヤーは(発行するSQLも含めて)変更しない。本 番環境を使って機械的に新旧の等価比較を行ったのち安全に移行する
© ZOZO, Inc. 入荷 発送 販売管理 顧客 サポート その他 Point.1
”境界づけられたコンテキスト”毎に トップモジュールを定義する コマンド クエリ 17 モジュラーモノリス基盤の詳細 Point.3 ひとつの”集約”として捉えられそうな 単位でサブモジュールを定義する Point.2 ”境界づけられたコンテキスト”内で コマンドとクエリを分離する 着庫 登録 荷受け 検品 棚入れ この粒度で厳密に独立させる (依存を制御する)
© ZOZO, Inc. 入荷 発送 販売管理 顧客 サポート その他 Point.1
”境界づけられたコンテキスト”毎に トップモジュールを定義する コマンド クエリ 18 モジュラーモノリス基盤の詳細 Point.2 ”境界づけられたコンテキスト”内で コマンドとクエリを分離する 着庫 登録 荷受け 検品 棚入れ オニオンアーキテクチャ この粒度で厳密に独立させる (依存を制御する) Point.3 ひとつの”集約”として捉えられそうな 単位でサブモジュールを定義する
© ZOZO, Inc. 19 コマンドの(暫定的な)レイヤー構造 Infrastructure domain application presentation Point.3
インフラレイヤーを 境界づけられたコンテキスト間で(暫定的に)共有する Point.1 形式的ではあるが依存関係の逆転 を行い境界づけられたコンテキスト毎に 独立したインターフェイスを定義する shared kernel Point.2 “在庫”のように境界づけられたコンテキスト をまたぐ存在は(暫定的に)共有する
© ZOZO, Inc. 20 コマンドの理想のレイヤー構造 Infrastructure domain application presentation コンテキスト境界
© ZOZO, Inc. 21 API化をリファクタリングと捉えて移行を進める “外部の振る舞い” 「リファクタリングとは、ソフトウェアの外部の振る舞いを 保ったままで、内部の構造を改善していく作業を指します」 が保たれているかは自動テストで検証・担保する 出典:
Martin Fowler著 「リファクタリング(第2 版) 既存のコードを安全に 改善する」(オーム社) 本番環境での等価比較 詳細は ZOZO TECH BLOG 本番環境における等価比較を活用した言語リプレイス https://techblog.zozo.com/entry/language-replacement-equality-comparison
© ZOZO, Inc. 22 本番環境での等価比較 1. 画面に表示される内容が一致している 2. DBなどの外部システムの状態が一致している 1.
HTMLテンプレートとそこに埋め込む変数の値が一致している 2. SQLなどの外部システムへのコマンドが一致している “外部の振る舞い” が保たれているかは自動テストで検証・担保する
© ZOZO, Inc. 23 モノリス 旧 input 本番環境での等価比較 モデル 操作
ユーザー操作 移行対象 HTMLテンプレートとそこに埋め込む変数の値が一致しているか検証する
© ZOZO, Inc. 24 モノリス 旧 input 新 モジュラー モノリスAPI
本番環境での等価比較 モデル 操作 ダミー モデル 操作 expected モデル操作の履歴 actual ダミーのモデル操作の履歴 ユーザー操作 input 比較する HTMLテンプレートとそこに埋め込む変数の値が一致しているか検証する
© ZOZO, Inc. 25 モノリス 旧 ID IDと共に発行された 更新系SQL全部残す commit
新 ID rollback モジュラー モノリスAPI リクエスト毎に 適当なIDを発行 IDと共に発行された 更新系SQL全部残す 比較する 本番環境での等価比較 SQLなどの外部システムへのコマンドが一致しているか検証する
© ZOZO, Inc. 26 ③リプレイストレーニング開始 おまけ (時間があれば) く
27 リプレイストレーニングで伝えたいこと REST APIの設計/トランザクションスクリプトからドメインモデル形式へ/ 強い整合性・結果整合性/同期・非同期/エンティティと値オブジェクト/ 静的型付き言語/Java/Spring Boot/OOP/AOP/SOLID原則/宣言的プログ ラミング/イミュータブルを意識する/単体テスト/e2eテスト/オニオン アーキテクチャ/DIP(依存関係の逆転)/コンテナ技術/k8s/CI/CD (...多すぎる)
... and more
28 基幹システムリプレイスのハイライトまとめ • 発送マイクロサービス化 • モジュラーモノリス基盤への移行 • (おまけ)リプレイストレーニング開始
None