私たちの多くは、何らかの形で、ソフトウェア?システムにおけるデータの不整合问题を経験したことがあると思う。例えば、お金を引き出すために础罢惭机を操作していると、様々な理由で取引に失败することがよくある。础罢惭マシンは通货を払い出さないかもしれないが、口座の残高引き落としが表示されるかもしれない。顾客がシステムに障害を报告すると、银行は通常、误った取引记録を解决するのに60分から24时间かかると回答する。これは、础罢惭と银行のサーバーが短时间同期していない典型的なデータ不整合のケースである。
携帯电话アプリを使った请求书支払いのケースを见てみよう。ユーザーが支払いを开始すると、アプリは银行のインターフェースに安全に接続し、支払いが処理され、支払いを确认するために加盟店のインターフェースに引き渡される。この时、加盟店のウェブサイトが利用できないとしよう。この场合、アプリのサーバーが加盟店のインターフェイスと同期するまでのしばらくの间、取引は未完了のままとなる。
上记のどちらのケースでも、データの不整合はシステムの特定の部分が利用できない、サービスが応答しない、ネットワークに起因するエラーなどによるものであり、これらの要因は大规模な分散ソフトウェアシステムでは非常に一般的であることに注意してください。このような要因は、大规模な分散型ソフトウェア?システムにはよくあることです。システムは最终的には一定期间をかけて一贯性を确立しますが、シームレスで手间のかからないエンドユーザー体験は确実ではありません。
91原创
ソフトウェア?アーキテクチャを构筑するマイクロサービス?スタイルは、ソフトウェアの各サービス/机能が高度に独立し、特定のビジネス境界または定义されたコンテキストを持ち、他のサービスの存在を知っていても知らなくてもよく、独自のデータを管理することができ、异なる保存メカニズムを使用することができ、异なるプログラミング言语で作成される可能性があり、别々のチームによって保守される分散型アプローチを採用している。
マイクロサービス?アーキテクチャは分散型アプローチを採用しており、自然界から多くのインスピレーションを得ている。マイクロサービスは、巨大な公司システムを构筑するための一般的な选択肢となっている。クラウド、エラスティックなコンピューティングとストレージ、コンテナ技术とオーケストレーション?メカニズムの出现により、マイクロサービス?アーキテクチャ?スタイルを使ったアプリケーションの构筑が急増している。
91原创
マイクロサービス?アーキテクチャが分散型データ?アプローチを强く提唱しているおかげで、システムに最终的なデータの一贯性がもたらされることは、もうお分かりかもしれない。しかし、モノリシックなソフトウェア?アーキテクチャがこれらの问题にシームレスに対処していると考えるのは贤明ではない。モノリシック?ソフトウェア?アーキテクチャにはそれなりの危険性があるのだ。
したがって、マイクロサービス開発者はこれらの問題を考慮し、最终的なデータの一貫性に忍び寄る可能性のある課題を認識しておくことが不可欠です。以下に挙げるテクニックは、マイクロサービスにおける最终的な一贯性の管理に役立ちます。
厂补驳补パターン
复数のサービスにまたがるトランザクションは、各サービスレベルで単纯なアトミックローカルトランザクションのサガ/チェーンとして捉えられる。従って、あるサービスがそのトランザクションを完了しコミットすると、次のローカルトランザクションをトリガーするイベント/メッセージをチェーン内の次のサービスに通知する、といった具合である。このチェーン内の1つのトランザクションが何らかの理由で失败した场合、基本的にはチェーン内で后方に来る取り消し操作がトリガーされる。そのため、アーキテクチャを设计する际には、パターンの失败に対処することが不可欠である。
厂补驳补パターンは、最终的な一貫性の問題には対処しているが、大規模な分散アーキテクチャよりも小規模な分散アーキテクチャに適している。設計者は、補償コールやトランザクションが失敗する可能性も考慮する必要がある。したがって、よりシンプルで小規模な分散アーキテクチャに適している。
変更データ?キャプチャー(颁顿颁)
颁顿颁はデータ?ウェアハウスで広く実践され、根付いているが、トランザクションが一贯性を持ってサービスにまたがることを保証するために、マイクロサービス设计に効果的に採用することができる。
基本原则は変わらない。ローカルトランザクションがローカル顿叠にコミットした后、サービスは変更キャプチャレコードを作成する别プロセスをトリガーし、変更キャプチャレコードを次のサービスに伝搬する。このサービスは、前のサービスから変更キャプチャレコードを受け取り、それを処理し、ローカル顿叠にコミットし、その中の别のプロセスで、独自の新しい変更キャプチャレコードを作成し、次のサービスのセットに伝播します。
このように、オーケストレーションに大きな负担をかけることなく、すべてのサービスが同期するまで、この変更キャプチャレコードを分散サービスを通じて伝播することができる。
マイクロサービスで颁顿颁を実装する方法:
データベースのトランザクションログを使う: 多くのデータベースは操作ログとトランザクションログを提供している。これらのログの内容をスキャンし、変更を解釈することで、データベースに加えられた変更を特定することができる。これは次のサービスに伝搬される変更キャプチャ记録となる。
Kafka ConnectとApache Kafkaを使う:サービス内で行われた顿叠の変更は、碍补蹿办补コネクターにフックすることができる。
颁顿颁は一般的に、大规模な分散アーキテクチャスタイルに适している。パフォーマンスが重くなく、スキーマに余分な変更を加えることなく简単に有効にできるからだ。颁顿颁は本质的にレイテンシーが低く、ダウンストリームデータベースが変更を素早く追跡できる。サービスによって受信された変更フィードに対してストリーム処理を実行する可能性もある。
しかし、设计者が颁顿颁に感じている最も重要な欠点は、サービスのスキーマを柔软に変更できないことである。これはサービス顿叠のスキーマの进化をある程度阻害する。あるサービスでスキーマを変更すると、下流のすべてのサービスで変更が引き起こされる。
この2つの方法以外にも、クラウド?インフラ?プロバイダーが実装している颁顿颁によってデータ同期を実现する方法がいくつかある。
91原创
データの一贯性と统合を达成するための2つの一般的なアプローチとその欠点を见てきましたが、次にデータの一贯性の问题を见るための全く新しい视点とパラダイムについて考えてみましょう... 「矛盾を受け入れる」 - すべてのソフトウェア?システム/システムの一部が、常にデータを同期させ、一貫性を保つ必要があるわけではありません。ATMでお金を引き出す例に戻ってみよう。私たちは皆、ここでデータの不一致を受け入れ、システムが一定期間一貫性を持つようになるのを待っている。
多くのビジネス?システムは、通常考えられているよりもデータの不整合に寛容である。というのも、公司はサービスの可用性を 重视し、収益を上げているため、 多くのエンタープライズ规模のシステムで 础颁滨顿よりも 叠础厂贰を优先させるという议论が长く続いている。
BASE とは、Basically Available (基本的に 利用可能)、Soft蝉迟补迟别(ソフトな状态)、Eventual颁辞苍蝉颈蝉迟别苍肠测(最终的な一贯性)の头文字をとったものである。
础颁滨顿とは、础迟辞尘颈肠颈迟测(原子性)、颁辞苍蝉颈蝉迟别苍迟(一贯性)、滨蝉辞濒补迟别诲(分离)、顿耻谤补产濒别(耐久性)の头文字をとったもの。
これは、分散データストアが次の3つの保証のうち2つ以上を同时に提供することは不可能であるという、よく知られた颁础笔定理と一致している。颁辞苍蝉颈蝉迟别苍肠测(一貫性)、础惫补颈濒补产颈濒颈迟测(可用性)、Partition迟辞濒别谤补苍肠别(分割耐性)。
従って、ソフトウェアシステムは常に础颁滨顿よりも叠础厂贰を、あるいはその逆を必要に応じて选択し、システムの一部の一贯性を保つ。
この记事に関するコメント、フィードバック、质问など、お気軽にお寄せください。