マイクロサービスはサービスを細かい機能単位に分割して実装する設計・開発手法である。マイクロサービスのような分散システムはサービスごとにデータベースを保持するのが望ましい。その場合、アプリケーション全体から見たデータの整合を取ることが困難だ。例えば送金処理などでエラーが発生した際、リトライ処理を2重に受け付けて処理してしまうと残金に誤りが生じてしまう。

 このようなデータの整合性が要求される処理にはリレーショナルデータベース管理システム(RDBMS)のトランザクション機能が有効だ。複数の処理を1つにまとめ、処理途中でエラーが発生しても始めからやり直せる。だがマイクロサービスのような分散システムではそうはいかない。複数のサービスが連携して一連の処理を行うため、正しくデータが処理できたのかをサービス間で保証しなければならないからだ。

 野村総合研究所(NRI)の近藤健上級テクニカルエンジニアは分散システムでデータの整合性を保つポイントを「エラーが起きたときの再実行」と説明する。受信側に同じリクエストが何度来ても1度だけ受信してそのほかのリクエストを破棄できることが重要だという。

データに固有のIDを振る

 そこで必要なのが冪(べき)等性である。冪等性は同じ処理を何度繰り返しても同じ結果を得られるというものだ。冪等性が担保されていればエラーによるリトライ処理が発生しても正しい結果が得られる。

 では、具体的にどう実装すればいいのだろう。富士通 サービステクノロジー本部アプリ技術コンサルティング統括部の阿部聡マネージャーは「主な方法の1つがデータに固有のIDを付与すること」と説明する。

 例えばデータに固有の冪等性キーなどのIDを割り当てておく。そして正常に処理できたデータはIDをログとして書き出す。これにより、複数回データが送られてきてもログに書き出されたIDと照らし合わせて判断できる。処理済みのIDが付与されたデータなら送信側にエラーを返したり、前回の処理結果を返したりできるようになるわけだ。

データにIDを付与して冪等性を保つ
[画像のクリックで拡大表示]

この先は日経クロステック Active会員の登録が必要です

日経クロステック Activeは、IT/製造/建設各分野にかかわる企業向け製品・サービスについて、選択や導入を支援する情報サイトです。製品・サービス情報、導入事例などのコンテンツを多数掲載しています。初めてご覧になる際には、会員登録(無料)をお願いいたします。