BT

sagaを使用したマイクロサービスのデータ一貫性

| 作者: Andrew Morgan フォローする 3 人のフォロワー , 翻訳者 編集部T _ フォローする 0 人のフォロワー 投稿日 2018年3月14日. 推定読書時間: 4 分 |

原文(投稿日:2018/02/14)へのリンク

読者の皆様へ:ノイズを減らすための一連の機能を開発しました。関心のあるトピックについて電子メールとWeb通知を受け取ることができます新機能の詳細をご覧ください。

ソフトウェアアーキテクトのChris Richardson氏は、QCon San Francisco 2017で、マイクロサービスにおけるデータ一貫性のための技術を紹介した。主な焦点はsagaパターンであり、それは、分散トランザクションを分割して、すべてコミットまたはロールバックする一連の小さなトランザクションに分割する手段である。

話の中で主に覚えておくべき点は次の通りである。

  • 個々のマイクロサービスに対してACIDの保証が可能である。それぞれが独自のプライベートデータベースを持つことができる。
  • マイクロサービスアーキテクチャで分散トランザクションを実現するためには、sagaパターンを採用することができる。これにより、トランザクションは一連のより小さいトランザクションに分割される。これは、メッセージングによって接続される。そして、完了するかロールバックする必要がある。
  • sagaパターンでは独立性は保証されない。つまり、例外への対策が必要である。
  • sagaのコミットあるいはロールバックを保証するために、トランザクションログのテーリングとメッセージングの組み合わせを使用できる。

Richardson氏は、マイクロサービスアーキテクチャでは、各マイクロサービスは、他のマイクロサービスから直接アクセスできない独自のプライベートデータベースを持つべきであると説明した。Richardson氏は、これによって結合が緩やかになる一方で、データの一貫性に問題があると指摘している。「現在、複数のマイクロサービスにまたがるトランザクションはどのように実装するか。」

この問題を解決するために、Richardson氏はsagaパターンを導入した。その基本的な原則は、ロックを保持する長いトランザクション(2相コミットのような)の代わりに、順番にコミットする一連の短いトランザクションに分割することである。これにより、以下のACD特性が得られる。

  • 原子性:すべてのトランザクションが実行されるか、またはすべてが相殺されるか
  • 一貫性:参照整合性は、ローカルデータベースとアプリケーションコードの両方によって与えられる
  • 永続性:これはメッセージブローカとデータベースによって保証される

ACIDの保証に近いが、sagaパターンにはまだ独立性がない。これは、未完了のトランザクションからデータを読み書きすることが可能であることを意味し、様々な隔離の例外を引き起こす。これを回避するために、Richardson氏はさまざまな対策を概説した。そこでは、sagaと可換性のあるトランザクションを作成することや、あるいは、バージョンファイルを使用してトランザクションを任意の順序で実行できるようにすることが説明された。

Richardson氏はまた、ロールバックがどれほど難しいかを実演した。もはや(ACIDデータベースのように)無償で手にいられなくなりので、代わりにロールバックをアプリケーションコード内に実装されなければならない。これに加えて、同期API要求によって非同期sagaがトリガーされるとき、いつレスポンスを返すかを決める必要がある。sagaが完了するまでブロックするか、すぐに終了して、ユーザから通知するようにするかである。Richardson氏は、可用性の向上と、ほとんどのUIが非同期をユーザから隠すことができるため、後者を推奨した。

Richardson氏はまた、2つある方法のうち1つで、sagaをどのように調整できるかを説明した。振り付け - どこで、sagaイベントがマイクロサービス間で非同期的に発生させるか。オーケストレーション - 中央管理されたサービスがsagaのすべてのステップのうち、どこでトリガして、どこまで追跡するか。Richardson氏は、オーケストレーションのアプローチが最も効果的であると考えている。循環依存を減らすことができるためである。中央化されれば、sagaにする理由は簡単である。これを実現するために、彼はJava向けに書かれたオープンソースのサガフレームワークであるTramを導入した。

saga間通信では、通常のトランザクションと同様に、sagaは完全かロールバックのどちらかであることを保証する必要があるとRichardson氏は説明している。このため、彼はメッセージングが唯一の合理的な選択だと考えている。これは主に、HTTPと比較して永続性が保証されているためである。また、メッセージを送信する前にローカルデータベースに書き込むことを提案した。つまり、新しいトランザクションを公開するためにトランザクションログをtailして、ACD保証をさらに強化することができる。

話のすべてはオンラインで見ることができTramのソースコードはGitHubで入手できる

 
 

Rate this Article

Adoption Stage
Style
 
 

この記事に星をつける

おすすめ度
スタイル

こんにちは

コメントするには InfoQアカウントの登録 または が必要です。InfoQ に登録するとさまざまなことができます。

アカウント登録をしてInfoQをお楽しみください。

あなたの意見をお聞かせください。

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする
コミュニティコメント

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする

ディスカッション

特集コンテンツ一覧

.NETの派生を理解する

Wayne Citrin 2018年7月18日 午前3時44分

InfoQにログインし新機能を利用する


パスワードを忘れた方はこちらへ

Follow

お気に入りのトピックや著者をフォローする

業界やサイト内で一番重要な見出しを閲覧する

Like

より多いシグナル、より少ないノイズ

お気に入りのトピックと著者を選択して自分のフィードを作る

Notifications

最新情報をすぐ手に入れるようにしよう

通知設定をして、お気に入りコンテンツを見逃さないようにしよう!

BT