85600
マイクロサービスに関する資料をよんでいるとマイクロサービス間のデータ一貫性に関して以下のように書いてありました。

> これらの一貫性のなくなる事象への対処法として、結果整合性というモデルでデータベースを動かす方法があります。

しかし調べると結果整合性については以下のように書かれています。

<https://izumisy.work/entry/2018/06/11/224719>

> 結果整合性
> はデータの更新でデータベースがロックされることはないため、可用性とスケーラビリティを維持することができる。その代わりノード間でのデータの一貫性はデータ複製にかかる時間に依存することになるため、必ずしも担保されない。

結果整合性は最新じゃないデータを取得するかもしれないということで一貫性がなく、一貫性のなくなる事象への対処法になっていないと思いましたが結果整合性で一貫性の保証になっているんでしょうか？  
結果整合性が一貫性の保証になっていないとすると、一貫性を保証してるモデルも知りたいです。
CC BY-SA 4.0
2022-01-10T04:11:02.087
85595
2022-01-22T07:39:40.247
2022-01-11T04:22:10.787
3060
45076
question
google-cloud
一貫性がなくなる事象への対処として結果整合性は有効ですか
> 結果整合性が一貫性の保証になっていないとすると、一貫性を保証してるモデルも知りたいです

結果整合性に対して、常にデータ一貫性を保証するのは強整合性モデルと言います。

> これらの一貫性のなくなる事象への対処法として、結果整合性というモデルでデータベースを動かす方法があります。

この部分がよくわからなかったのですが、データ一貫性を重視し強整合性モデルを選択した場合、各サービスへのデータ更新は同期処理にする必要があります。分散されたノードに対して同期で更新した場合、すべてのノードの更新処理が完了するまで待機することになるので、パフォーマンスが犠牲になります。

これに対して、各サービスのデータ更新を非同期にした場合、すべてのノードへの更新完了を待つ必要がなくなるので、パフォーマンスが向上します。これが結果整合性モデルで「
**結果的には**
分散ノード間のデータ整合性がとれた状態になる」、言いかえると「一時的にノード間のデータは不整合な状態になる」になるというものです。これは非同期更新の採用により生じるデメリットです。

まとめると、データ整合性とパフォーマンスのトレードオフを考慮し、結果整合性モデルと強整合性モデルのどちらかを選択することになるのです。一般的には、マイクロサービスアーキテクチャのような分散型データベースであれば、結果整合性モデルが採用されることが多いです（サービス同士が離れているので、同期処理にするとパフォーマンス要件を満たせないため）。

この話は、マイクロサービスに限らず分散データベースであれば、必ず出てくるテーマです。例えばDNSは、自分の管理するDNSサーバーのゾーンレコードを編集しても、すぐに世界中にDNSサーバーに反映されるわけではありません（一時的なデータ不整合の状態）。これはDNSが分散データベースであり、結果整合性モデルであるから、とみなすことができます。

追記です。

> これらの一貫性のなくなる事象への対処法として、結果整合性というモデルでデータベースを動かす方法があります。

この部分は逆です。一貫性を重視するなら、結果整合性モデルではなく強整合性モデルを採用することになります。

追記その２。

マイクロサービスの場合、可用性の向上を目的として結果整合性モデルが採用されることがあります。

強整合性モデルの場合、更新は同期処理になるので、更新先サービスの死活に依存します。このためサービス同士の独立性が損なわれ、マイクロサービスのメリットを充分に生かせません。この問題を解決するため、サービス間のデータ連携にキューやストレージサービスを採用することがあります。

  * サービスA: データ更新を依頼する
  * サービスB: データを更新する

とすると、更新処理は、

  * サービスA→キュー（またはストレージサービス）にデータを登録
  * サービスB→キューからデータを取り出し更新

となります。

このようなアーキテクチャを採用すると、キューがバッファとして機能するので、サービスBの死活や処理状況を気にすることなく、サービスAは更新を依頼できるようになり、その結果サービス同士の独立性が高まります。

これが、可用性の向上を目的として結果整合性モデルを採用した例です。
CC BY-SA 4.0
2022-01-10T08:31:20.020
85600
2022-01-22T07:39:40.247
2022-01-22T07:39:40.247
4982
4982
85595
answer