
はじめに
10X ソフトウェアエンジニアの鈴木です。 これからしばらく「お届けチーム取組紹介」と題して「イベント駆動アーキテクチャ」につながることを複数の記事に渡ってお伝えしていきます。 product.10x.co.jp
お届けチームでは、 「ピックパック」というお客様から承った内容を元に、商品を売り場や在庫置き場からとってきて(ピック)、箱詰め(パック)する業務領域(以下ピックパック)のシステムを疎結合化することで、技術的な課題を解決することを目指してきました。
社内では「モジュール化」という言葉を使用して取り組んできましたが、これは「ピックパック領域のコードをお客様へ対面するためのコードと疎結合にする取り組み」でした。本記事では、この取り組みの概要を紹介します。技術的な詳細については、後続の記事で解説します。

チャレンジ前の構造
取り組み前のシステムでは、Orderクラス(as 1 Firestoreドキュメント)に、注文に関するあらゆる領域のロジックとデータ永続化処理が集中していました。具体的には、お客様の注文内容、ポイント処理、クーポン処理などのお客様との契約に関する情報から、ピックパック業務の状態、配達の状態など、注文処理全体に関わる情報が含まれていました。
このような設計は、単一のプロダクトで注文受付から配達完了までを管理できるという利点がある一方で、システムが密結合になり、機能の拡張や修正が困難になるという課題がありました。

主な課題は以下の3点です。
- コード変更の複雑さ: 複数のチームがOrderクラスを共有していたため、コードを変更する際に他のチームとの調整が必要となり、開発のボトルネックとなっていました。
- データ操作のロック競合: Orderドキュメントが複数の商品情報を含んでいたため、別々の商品に対する同時操作が頻繁に競合し、データ整合性の問題が発生していました。とくにピッキングの業務中では個別商品ごとに作業は並走するので問題が顕著に現れていました。
- カスケード障害のリスク: ピックパック領域の障害が、お客様の注文明細表示など、直接関係のない機能にまで影響を及ぼすカスケード障害が発生しやすい状況でした。 例えば、ピックパック処理に問題が発生した場合、お客様が注文内容を確認できなくなるという問題が発生していました。お客様は、注文した商品が届くかどうかを知りたいだけなのに、スタッフの業務プロセスが原因で注文内容すら確認できなくなるという事態は避けるべきです。
とくにお届けチームのプロダクト改善はピックパックに関わることが現在多く、コードや構造改善の恩恵が得やすいということで改善の実施に踏み出しました。
構造の改善
これらの課題を解決するために、以下の取り組みを実施しました。
- データモデルの分離: お客様対応に必要なデータとピックパック業務に必要なデータを、別々のFirestoreドキュメントに分割しました。これにより、各領域のデータを独立して管理できるようになりました。
- コードの分離: データ操作を行うクラスも、お客様対応とピックパック業務で分離しました。これにより、各領域のコードの独立性が高まり、変更の影響範囲を局所化できるようになりました。
これらの取り組みに伴い、以下の2つのデータ連携が必要になりました。
- お客様からの注文内容に基づいて、ピックパック担当者に指示を出す。
- ピックパックの進捗状況をOrderドキュメントに反映する。
これらのデータ連携を、業務上の意味を持つ「イベント」としてモデル化し、イベント駆動型の非同期処理コンポーネントを導入することで実現しました。 また、ピックパックの進捗状況をリアルタイムに集計するために、イベントをトリガーとして集計処理を実行する仕組みも導入しました。


これらの改善により、Orderとピックパックの間の影響関係がインターフェースを通じて明確になり、「実はXXXにも影響があった」という予期せぬ影響を減らすことができました。
ロック競合についてはピックの操作はPickingというある1注文の1商品ごとにあるデータへの操作になったので、最終的にOrderドキュメントへのデータ連携処理が残るものの、バックグラウンドで非同期に処理されるためスタッフの業務への影響はほとんどなくなりました。
カスケード障害のリスクも、データとコードの分離、および非同期処理の導入によって大幅に低減しました。ピックパック処理にバグがあった場合でも、ピックパック業務が開始されるまでの間に修正できれば、お客様やスタッフに影響が出るのを防ぐことができるようになりました。これは、改善前はピックパック処理のバグが注文受付自体を妨げる可能性があったことと比較すると、大きな改善です。
本記事では、ピックパック領域の疎結合化に関する取り組みの概要と、その効果について説明しました。技術的な詳細については、後続の記事で詳しく解説する予定です。
読者になるボタンを押すと後続の記事が公開されたときに通知を受けとれるのでおすすめです。