「マイクロサービスで最も難しいのがデータ同期の問題」。アクセンチュアの福垣内孝造テクノロジーコンサルティング本部 テクノロジーアーキテクチャグループ クラウドソリューションアーキテクトがこう話すように、マイクロサービス化を突き詰めていくと、データ同期を避けては通れない。
マイクロサービスでは小さなサービスを疎結合に連携することで、システム変更のスピードアップを図る。そのために、サービスごとに独立したデータソースを持つのが理想だ。サービスの疎結合を保ちながらデータソース間でどうやってデータを同期するのか、代表的な手法を見ていこう。
マイクロサービスでは結果整合性が基本
従来の企業システムはトランザクション制御によりデータ同期を求めるユースケースが多い。特に基幹系システムでは、注文と在庫、入金と出金などデータの整合性を厳密に図る必要がある。
これに対してマイクロサービスでは「トランザクションの必要性から考える必要がある。疎結合、非同期、結果整合性が基本になるからだ」(アマゾン ウェブ サービス ジャパン スタートアップ事業本部の塚田朗弘技術統括部長)。マイクロサービスのデータ同期では、結果整合性を許容できるか否かが焦点になる。
結果整合性とは、分散データベース環境でデータが更新された際に、一定時間経過後には最終的な一貫性が担保されるという考え方だ。言い換えると、更新データの一貫性は即時には担保されないので、「結果整合性を許容できないのならトランザクションを分割すべきではない」(塚田技術統括部長)。
では、なぜマイクロサービスでは結果整合性が基本になるのか。
イベントソーシングで変更を伝達
マイクロサービス間でデータを同期する代表的な手法が「イベントソーシング」である。サービス同士を疎結合に保ちながら、データの状態ではなく、変更イベントを非同期にやり取りする。例えば、アプリケーションとデータソースが一体になったサービスが複数ある環境で、データ更新イベントを伝達する。イベントを受け取ったサービスは各自のデータソースをそれぞれ更新する。更新作業にタイムラグはあるものの、最終的にデータの一貫性が担保され、結果整合性が実現されるわけだ。
イベントソーシングの活用により、複数のデータソースにまたがった処理が実現できる。各サービスに閉じたローカルトランザクションを非同期につないでワークフローを構成する手法で、「Sagaパターン」と呼ばれる。
一連の処理中になんらかの障害が発生した場合は、更新したデータを元に戻す必要がある。そのために「補償トランザクション」を用意しておき、いわゆるロールバック処理を実現する。
Sagaパターンで実装した処理の流れは一見、トランザクションを実現しているようだが、あくまで結果整合性がベースであることに注意が必要だ。それでも、数百ミリ秒~1秒程度の整合性の遅延を許容できるのであれば、十分実用的と言える。日本マイクロソフトの樽沢広亨シニア・インダストリー・テクノロジー・ストラテジストは「IT部門の人は、その遅延を待てるか待てないかを判断できない。だから、それが判断できる業務側のメンバーにプロジェクトに加わってもらうべきだ」と話す。
結果整合性を許容できるか否かは、IT側でデータ同期の遅延時間を計測し、それを業務側に提示しなければ判断できるものではない。