Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ZOZO基幹システムリプレイス ハイライト(2025年3月版) / zozo-backoff...

takumi.okamoto
March 04, 2025
12

ZOZO基幹システムリプレイス ハイライト(2025年3月版) / zozo-backoffice-system-replacement-highlight-202503

2022年ごろから本格始動したZOZOの基幹システムリプレイスのハイライトを主に技術的な視点で紹介します。

takumi.okamoto

March 04, 2025
Tweet

Transcript

  1. © ZOZO, Inc. 株式会社ZOZO 基幹システム本部 物流開発部 基幹リプレイスブロック 岡本 拓実 2020年4月に株式会社ZOZOに新卒入社

    レガシー環境での開発・運用を経て 現在はリプレイスプロジェクトに従事 趣味は不要不急の買い物で散財すること 2
  2. © ZOZO, Inc. 5 発送マイクロサービス化 発送作業者 @ZOZOBASE 大きな泥団子 発送準 備

    発送業 務 返金 在庫 注文 会計 入荷 顧客 商品 セール クーポン 分析 委託返却 抽選 コスメ レポート マスター 権限      注文 発送 準備 発送 業務 発送 完了 詳細は ZOZO TECH BLOG モノリスからマイクロサービスへ -ZOZOBASEを支える発送システムリプレイスの取り組み https://techblog.zozo.com/entry/replacing-shipping-system-supporting-zozobase 発送 業務 発送 マイクロサービスとして切り出す 発送に関わる機能
  3. © ZOZO, Inc. 8 使用技術 Aurora MySQL EKS EKS MSK

    Cluster SQS VBScript Microsoft SQL Server MSK Connect DDD (Domain-Driven Design)
  4. © 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
  5. © 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
  6. © ZOZO, Inc. 12 コマンド・クエリの分離戦略: Not CQRS, Yes CQS •

    どちらも同じRDBを利用する。 ◦ 「コマンド側はNoSQL」といったインフラの最適化まではしない。 ◦ 今回はクエリ側までの反映ラグがシビアなシステム、開発メンバーにCQRS経験 もないので回避する。 • アプリケーションのモデルは完全に分離する。 ◦ コマンド側のモデルをクリーンに保つための工夫。 コマンド側とクエリ側で同じテーブルを利用していたが、コマンド優位なテーブル設計 だったこともあり、クエリ側で期待するパフォーマンスが出せなかった。 対策として一部クエリ専用のテーブルも作成して利用している。実装コストを鑑みて、イ ベントを経由せずにコマンド側処理の同一トランザクション内でコマンド用・クエリ用両 方のテーブルを更新している。
  7. © ZOZO, Inc. 13 トランザクション戦略: 厳密に1集約1トランザクションにしない • DDDにおいては集約が更新の単位であり、複数の集約を同一トランザ クションで更新するのはスケーラビリティを維持するためにも避ける べき。

    • ただしコストもかかる。発送サービスではアプリケーションコードの 設計は将来的な分離を強く意識しつつも、複数の集約を同一トランザ クションで更新することも許容する。 ◦ 現状ではパフォーマンス的にも問題は出ていない。論理的には分離しているの で将来に備えることもできている。良い選択だった。 ◦ (当時の集約設計が甘かった可能性もゼロではないがやれることはやった。)
  8. © ZOZO, Inc. 16 モジュラーモノリス基盤への移行方針 • 既存のトランザクション境界の見直しなど真の意味で泥団子を解きほ ぐすのは後回しにして、とにかくモジュラーモノリス基盤へと移行す る。 •

    モノリスにはフロントエンドの実装も存在する。まずはバックエンド の実装を全てモジュラーモノリス基盤のAPI経由で呼び出す形を目指 す。 • 基本的にインフラレイヤーは(発行するSQLも含めて)変更しない。本 番環境を使って機械的に新旧の等価比較を行ったのち安全に移行する
  9. © ZOZO, Inc. 入荷 発送 販売管理 顧客 サポート その他 Point.1

    ”境界づけられたコンテキスト”毎に トップモジュールを定義する コマンド クエリ 17 モジュラーモノリス基盤の詳細 Point.3 ひとつの”集約”として捉えられそうな 単位でサブモジュールを定義する Point.2 ”境界づけられたコンテキスト”内で コマンドとクエリを分離する 着庫 登録 荷受け 検品 棚入れ この粒度で厳密に独立させる (依存を制御する)
  10. © ZOZO, Inc. 入荷 発送 販売管理 顧客 サポート その他 Point.1

    ”境界づけられたコンテキスト”毎に トップモジュールを定義する コマンド クエリ 18 モジュラーモノリス基盤の詳細 Point.2 ”境界づけられたコンテキスト”内で コマンドとクエリを分離する 着庫 登録 荷受け 検品 棚入れ オニオンアーキテクチャ この粒度で厳密に独立させる (依存を制御する) Point.3 ひとつの”集約”として捉えられそうな 単位でサブモジュールを定義する
  11. © ZOZO, Inc. 19 コマンドの(暫定的な)レイヤー構造 Infrastructure domain application presentation Point.3

    インフラレイヤーを 境界づけられたコンテキスト間で(暫定的に)共有する Point.1 形式的ではあるが依存関係の逆転 を行い境界づけられたコンテキスト毎に 独立したインターフェイスを定義する shared kernel Point.2 “在庫”のように境界づけられたコンテキスト をまたぐ存在は(暫定的に)共有する
  12. © ZOZO, Inc. 21 API化をリファクタリングと捉えて移行を進める “外部の振る舞い” 「リファクタリングとは、ソフトウェアの外部の振る舞いを 保ったままで、内部の構造を改善していく作業を指します」 が保たれているかは自動テストで検証・担保する 出典:

    Martin Fowler著 「リファクタリング(第2 版) 既存のコードを安全に 改善する」(オーム社) 本番環境での等価比較 詳細は ZOZO TECH BLOG 本番環境における等価比較を活用した言語リプレイス https://techblog.zozo.com/entry/language-replacement-equality-comparison
  13. © ZOZO, Inc. 22 本番環境での等価比較 1. 画面に表示される内容が一致している 2. DBなどの外部システムの状態が一致している 1.

    HTMLテンプレートとそこに埋め込む変数の値が一致している 2. SQLなどの外部システムへのコマンドが一致している “外部の振る舞い” が保たれているかは自動テストで検証・担保する
  14. © ZOZO, Inc. 23 モノリス 旧 input 本番環境での等価比較 モデル 操作

    ユーザー操作 移行対象 HTMLテンプレートとそこに埋め込む変数の値が一致しているか検証する
  15. © ZOZO, Inc. 24 モノリス 旧 input 新 モジュラー モノリスAPI

    本番環境での等価比較 モデル 操作 ダミー モデル 操作 expected モデル操作の履歴 actual ダミーのモデル操作の履歴 ユーザー操作 input 比較する HTMLテンプレートとそこに埋め込む変数の値が一致しているか検証する
  16. © ZOZO, Inc. 25 モノリス 旧 ID IDと共に発行された 更新系SQL全部残す commit

    新 ID rollback モジュラー モノリスAPI リクエスト毎に 適当なIDを発行 IDと共に発行された 更新系SQL全部残す 比較する 本番環境での等価比較 SQLなどの外部システムへのコマンドが一致しているか検証する