マイクロサービスのデータベース設計

個別のデータベース:

キーマイクロサービス設計、データベース設計の1つは、基本的な原則は、各サービスは、独自の個別のデータベースを持っているということです、そして唯一のマイクロサービス自体がデータベースにアクセスすることができます。これは、以下の3つの理由に基づいています。

  • 最適化サービスインタフェース:マイクロサービスとの間のインターフェース可能な限り小さく、唯一の最高のサービス呼び出しインターフェース(RPCまたはメッセージ)は、他のインターフェース。サービスは、排他的マイクロ独自のデータベースでない場合は、データベースが大きくインターフェイスの範囲を拡張インタフェースの一部となっています。
  • トラブルシューティング:本番環境でのエラーとそれらのほとんどは、データベースに関連する、データは問題外のデータベースを使用するか、問題外のいずれかです。あなたは完全にデータベースへのアクセスを制御することができない場合は、さまざまなエラーが発生します。あなたのデータベースや他の部門のデータベースにアクセスするためのクライアントと直接他のプログラムデータに直接接続することができ、これらは、エラー調査の難易度が高く、プログラム内で見つけています。問題は、プログラム内にある場合は、あなたのコードへの変更限り、このエラーはありません。上記のエラーは、あなたは彼らが再び起こるか予測なしのよ。
  • パフォーマンスチューニング:パフォーマンスのチューニングは同じである、あなたは、その性能を確保するために、データベースを完全に制御を持っている必要があります。他の部門は、データベース、およびクエリのみにアクセスする必要がある場合、それらは別のデータベースクエリであるように、あなたは、さらに、読み取り専用のデータベースを作成することができますので、あなたのライブラリーには影響を与えません。

あなたがサービスにアクセスできる理想的な設計データベースは唯一の、あなただけ(でサービスコールを参照してください他のサービスへのすべてのアクセスは、マイクロを実現するために来ている、データベースに独自のデータを呼び出す最高のマイクロサービス」の中で呼び出しますデザイン ")。もちろん、実際のアプリケーションでは、単純なサービスコールはパフォーマンスやその他の要件を満たしていない可能性があり、異なるマイクロサービスは多くはいくつかのデータを共有する必要があります。

データを共有:

マイクロサービス間のデータ共有は、次の4つの方法の下で持つことができます。

静的テーブル:

そこ国家など、多くの用途で使用することができるいくつかの静的なデータベーステーブルは、であり、内部手続きは、エンドユーザの表示を生成するために接続(結合)するために国家のデータのテーブルを行う必要があり、マイクロ効率にそのようなサービスコールは影響を与え、高くありませんパフォーマンス。一つの方法は、それが読み取り専用で、そのようなテーブル内の各マイクロサービスで設定されているので、あなたは、データベース接続を行うことができます。もちろん、あなたがデータの同期を確保する必要があります。ほとんどの場合、このプログラムは、理由は以下の2点で許容可能です:

  1. 静的データベースのテーブル構造は基本的に同じです:テーブル構造が変更された後、あなただけのデータベーステーブルにすべてのマイクロサービスを変更したいのですが、また、すべてのマイクロサービスのためのプログラムを変更することはないので。
  2. データベーステーブル内のデータの変更が頻繁にされていません。このデータは、ワークロードと同期されません。あなたは、データが頻繁に変更されない場合は、データベースは常に、遅延されます同期する際に加えて、あなたは同期してから選ぶことがたくさんあります。

読み取り専用アクセス、ビジネス・データを:

あなたはダイナミックなビジネスデータ内の他のデータベースを読み取る必要がある場合は、理想的な方法は、サービスコールにあります。あなただけのいくつかの他のマイクロコンピューティングを行うためにサービスを呼び出す場合は、通常の状況下でのパフォーマンスは、それが許容可能です。あなたが接続データを作成する必要がある場合は、代わりにSQL文で、やってプログラムコードを使用することができます。試験性能が要件を満たしていない後にした場合は、データベースのテーブルに読み取り専用のデータを構築するために自分自身を考えることができます。データの同期化は、基本的に2つの方法があります。それはイベント駆動型である場合、メッセージは、RPCが同期マナーモードである場合、提供するデータベース自体を使用するか、サードパーティの同期ソフトウェアによって同期されます。

通常の状況下で、あなただけのいくつかの他のデータベーステーブル、各テーブル一部のフィールドだけが必要な場合があります。このとき、他のデータベースには、すべての書き込み動作と、対応するビジネス・ロジックの検証は、我々はメインテーブルを呼び出し制御、データの究極の源です。あなたのライブラリーは、読み取り専用のテーブルから呼び出すことができます。データがマスター表に書き込まれると、すべてがマイクロサービステーブルからのメッセージと更新のために耳を傾けてきた、テーブル内の読み取り専用のデータをブロードキャストメッセージを送信します。リスクは、静的なテーブルよりもはるかに大きいので、しかし、あなたは、特に注意する必要があります。これは、最初の変更テーブルの構造がより頻繁になるだし、それは完全にあなたのコントロールを超えて変化します。データ同期要件が比較的高いように頻繁に更新される静的第2のサービス・データ・テーブルとは異なり。特定のビジネス要件に応じて、どのくらいの遅延を決定することは可能です。

また、それには2つの問題があります。

  1. データのボリューム:データの量データベースでは、パフォーマンスに影響を与える主な要因です。このデータは外にあるので、その交通法規を把握することが助長されていません、それは容量計画のため困難であり、パフォーマンスチューニングが良くなることはできません。
  2. ** **漏出したインターフェース:マイクロサービスとの間のインターフェイスは、あなたが他のサービスに影響を与えずに、内部手続きおよびデータベースに変更を加えることができ、唯一のサービス・コール・インターフェースを持っていました。今、データベーステーブルの構造は、インタフェースの一部となっています。リリース後インタフェースたら、基本的に大幅にあなたの柔軟性を制限する、変更することはできません。幸いなことに、他の組み込みのテーブルので、バッファと、時にメインテーブルの変更は、テーブルから更新を同期する必要はないかもしれません。

あなたが呼び出しにサービスを提供することができない限り、すべての機能を完了するための方法(ローカルデータベースが読み取り専用いない)、またはあなたはRPCモードまたはイベント駆動型の統合とマイクロサービスであるかどうか、上記の問題は避けられません。しかし、あなたは上記に起因する問題の影響を低減するために、合理的な計画を介してデータベースを変更することができ、以下、詳細に説明します。

読み、ビジネスデータへのアクセスを記述します。

これは、最も複雑なケースです。一般的には、テーブルが主テーブルとテーブルから他のテーブルである必要があります。マスターテーブルには、メインの情報が含まれており、メインメッセージをテーブルにコピーされますが、マイクロサービスはテーブルから追加のフィールドを作成する必要があるでしょう。表から読み取ら両方に、マイクロローカルサービスはまた、書き込み動作有します。そして、メインテーブルとテーブルには、優先順位の関係を持っています。これは、メインテーブル、主キーテーブルマスタテーブルに由来し、従って第一なければならず、そこからテーブル。

ファイル

ソース

図は一例です。我々は2フィルム関連のマイクロサービス、映画のフォーラムがあると、ユーザーが動画にコメントすることができます。他には、映画の店です。「ムービー」の共有テーブルで、左側の1は、フィルムフォーラムのライブラリである、それは「映画」テーブルのメインテーブルです。右側には、テーブルから「映画」の表ですが、映画の店のライブラリです。彼らは、「ID」フィールド(主キー)を共有します。メインテーブルは、データの主な情報源であるが、表「数量」と「価格」の主テーブルにフィールドはありません。マスタ・テーブル・データが挿入された後、メッセージ、テーブルから受信したメッセージは、ローカル「映画」テーブルにデータを挿入します。そして、テーブルからテーブルを変更すると、「数量」と「価格」フィールドになります。この場合、各フィールドは一意のソース(マイクロサービス)が割り当てられ得、イニシアチブの唯一のソースフィールドを変更する権利を有し、他のマイクロサービスは、受動的(受信により送信されたメッセージのソースを変更した後、再び変更)を変更することができます。この例では、「数量」と「価格」フィールドのソースは、テーブルの右、左テーブルの他のすべてのフィールドのソースです。表からのみの存在下で本実施「量」と「価格」は、このように書き込まれたデータは、テーブルの主テーブルの方向から、一方向です。主テーブルにはまた、これらのフィールドが必要な場合は、彼らが戻って書き込まれる必要があり、それはデータが書き込まれ、双方向になります。

直接アクセス、他のデータベース:

これは絶対に禁止する方法です。本番環境では、多くのバグやパフォーマンスの問題は、このアプローチによって生成されます。上記3つの方法ので、パフォーマンスの問題が他に影響を与えないように、データベースの物理的な分離、データベースを生成し、別の新たなローカルの読み取り専用データベースのテーブルです。プログラムが実行できるように加えて、時にメインライブラリテーブル構造の変更、あなたは一時的に、ライブラリテーブルから変わらないことができます。他の人のライブラリに直接アクセスすると、メインライブラリ変更した場合、他のマイクロサービスプログラムは、すぐにエラーが発生します。参照してくださいApplicationDatabaseを

下位互換性データベースの更新:

上記の議論からわかるように、データベースのテーブル構造は、物事の広い範囲に影響を及ぼしている変更します。マイクロサービスアーキテクチャでは、他のサービスで共有テーブルは読み取り専用のコピーが存在します。今、あなたは、テーブル構造を変更したい場合は、だけでなく、他のマイクロサービスへの影響を考慮する必要があります。展開を確保するためにモノマー(モノリシック)アーキテクチャは、ロールバックすることができる場合、データベースの更新は、下位互換性があります。互換性のためのもう一つの理由は、青緑色のリリース(ブルー・グリーンの展開)をサポートすることです。この配置モードでは、あなたはそのバージョンに各負荷分散要求によって決定されたコードの新旧両方のバージョンを、持っています。彼らはあなたが別のデータを使用することができ、(データベースは下位互換性がある必要)データベースを共有することができます。次の種類の面で単純なデータベースの更新:

  • テーブルまたはフィールドを増加:フィールドヌルが好ましく、この操作は下位互換性がある場合。null以外の値がデフォルト値を挿入する必要があります。
  • テーブルやフィールドを削除します:その後、いくつかのバージョンとは、削除した後、一時的に予約したテーブルやフィールドを削除することができます。
  • フィールド名の変更:新しいフィールドを追加し、データフィールドは、データベース・トリガー(またはプログラム)で、古いから新しいフィールド、古いフィールドと(移行期間のために使用される)新しいフィールド同期にコピーされます。その後、いくつかのバージョンの後にそれらを削除するには、(元のフィールドが表示さダウンタイムなしでデータベーススキーマを更新します)。
  • テーブル名を変更します:データベースが更新可能なビューをサポートしている場合は、最も簡単な方法は、テーブルの名前を変更し、(参照元のテーブルに更新可能なビューポイントを作成することです進化データベース設計を)。データベースが更新可能なビューをサポートしていない場合は、フィールド名が似て修正するために使用される方法は、あなたは新しいテーブルを作成して、データの同期を行う必要があります。
  • レビューフィールドタイプ:データのコピー、データ型変換を行う必要がある場合を除いて、フィールド名とほぼ同じ変化、。

問題がある場合は、下位互換性データベースの更新の利点が配備されている。ロールバックのために。限り、プログラムは、データベースをロールバックすることなく、ライン上でロールバックされます。一般的に唯一のバージョンにロールバックをロールバックします。この展開の時点でテーブルやフィールドを削除する必要がある方は、変更を加える、またはいくつかのバージョンまで待つ、問題がないことを確認してから削除されません。もう一つの利点は、それがすぐにテーブル内の他のマイクロ共有サービスに直接影響を持っていないということです。このマイクロサービスをアップグレードする場合、他のマイクロ更新サービスは、これらのデータベースの影響を評価し、適切なプログラムやデータベースの変更を行うかどうかを決めることができます。

クロスサービスの事:

マイクロサービスの難しさは、クロスサービスサポート物事を達成する方法です。2フェーズ(2フェーズ・コミット)コミット要求性能の証明、今基本的には誰も使用を満たすことができませんでした。それは、全会一致佐賀と呼ばれる方法が承認されました。その原理は、各操作のもの、一つ一つの補償動作(補正トランザクション)を記述して、補償ロールバックフェーズの各操作を実行することです。以下の例では、3つの操作のT1、T2、あるものでT3の合計。各操作は、補償動作、C1、C2、C3を定義します。物事前方オーダー実行は、ロールバックが最初C3の逆の順序で実行される最初のT1を、実行された場合。各操作(順方向動作及び補償動作)の物事命令(コマンド)としてパッケージ化されている、すべてのコマンドを実行する責任佐賀実行コーディネータ(佐賀実行コーディネータ(SEC))。実行する前に、すべてのコマンドが順次次に佐賀コーディネータがログからのコマンドを実行して除去され、ログに格納されている順に実行されます。実行エラーが発生した場合、このエラーは、ログに書き込むことができ、すべてのコマンドが実行されて停止され、それが操作をロールバックし始めました。

ファイル

ソース

佐賀は、それが実行もので、最終的な一貫性(結果整合性)、したがって、データが不整合であることを確認することができ、この矛盾は、他のプロセスによって見ることができ、一貫性(整合性)の要件を緩和します。人生では、ほとんどの場合、我々は一貫性を求めるとそれほど高くなく、短期的な矛盾が許容可能です。そのような実装プロセスで物事のデータベースで実行されるのではなく、実行する方法を占めることにより、2つの動きに分割されているだけでなく、最終的に一貫することを確実にするために銀行転送操作、など。

佐賀の原理は非常に単純なようだが、正しい実装にはまだいくつかの困難を持っています。そのコアの問題は、エラーの取り扱いは、我々はそれが別の記事に書く必要を十分に認識していると言うべきであるということです、私は、主なポイントについて話しています。ネットワーク環境が信頼できない、長い時間のために結果を返さないことがあり、実行中の命令は、その後、最初に、あなたはタイムアウトを設定する必要があります。第二に、あなたは完成された値を返さない理由はわかりませんが、ネットワークが問題をコマンド、または完全な犠牲がなかったので、私は補償動作を実行するかどうかわからないので。正しいアプローチは、完了確認するまで、元のコマンドを再試行し、その後、補償動作を実行するための時間です。しかし、コマンドのための要件は、この操作は、それを何回も行うことができることを意味、(べき等)冪等する必要がありますが、最終結果はまだ同じであること、があります。

また、補償動作一部の操作は限り、あなたはそれにお金を返すように、このような支払業務として、生成するのが比較的容易です。しかし、電子メールなどの一部の操作は、終了後のバック状態に方法は以前に存在しない、そしてあなたは、以前の情報を修正するためにメッセージを送ることができます。こうして補正動作は、必ずしも、元の状態に戻り、元のが、操作によって生成された効果を相殺しません。あなたが詳細をお知りになりたい場合は、参照ここ

マイクロサービスを分割:

当社独自のプログラム、主に単一のプログラムが、現在はマイクロサービスにそれを分割したい、既存のアプリケーションへの影響にそれを減らすために何をすべきか?

ファイル

ソース

我々は、図2に、上記の例を使用して行います。これは、他のライブラリには3つのテーブル、「コアクライアント」、「コアSKU」、「コアアイテム」を持って、彼らは以下の地図データベースを共有し、「倉庫アプリ」で、1は「スタイリングアプリ」で、2つのプログラムで構成されています。

ファイル

ソース

それは「コアクライアント」リストへのアクセスを必要とする、私たちは「顧客サービス」と呼ばれるマイクロサービスを分割するとします。最初のステップは、我々は最初のデータベースが動かないサービスに出て、元のプログラムコードから分割し、このサービスは、まだ元のデータベースを指しています。他のプログラムは、もはや直接、サービス管理テーブルにアクセスしていないが、データサービスコールを取得したり、別の共有テーブルを構築します。

ファイル

ソース

第二のステップは、データベーステーブルと、サービスのうちの分割は、サービスは、独自のマイクロデータベースを持っていない、もはや元の共有のデータベースが必要になります。そして、それはのマイクロサービス本当の意味になります。

マイクロ・トークサービス上記の分割は、分割以上が存在する場合、必要が方法上記の手順に従います。

また、Martin Fowler氏は、彼の記事で「Microservicesにモノリスを破る」良い提案がありました。それはあなただけのコードを分割したくない、モノマープログラムからサービスを分割する際に、あります。今では、オリジナルとは若干異なっていたかもしれ必要があるため、元のデザインは非常に適用されない場合があります。また、技術が更新されたコードは、それに応じて変換を変更しなければなりません。より良いアプローチは、このビジネス機能を実現するために、新しいデザインと技術で、ビジネス機能を解決する上ではなく、コード分割に焦点を当て、(代わりに元のコードを書き換える)本来の機能を書き換えることです。

結論:

データベースの設計はマイクロサービス設計のキーポイントは、基本的な原理は、各サービスは、独自のマイクロ別のデータベースを持っており、唯一のマイクロサービス自体がデータベースにアクセスできるということです。データは、実施例の表から、サービスコールを介してマイクロサービスとの間で共有する、またはメイン。正しい方法同期を見つけるために、データを共有する場合。マイクロサービスアーキテクチャでは、大規模な変更は、この変更は、下位互換性があることを確認する必要があり、データベースに影響を与えます。クロスサービスの標準的な方法のものは佐賀です。スプリットサービスモノマーにマイクロプログラムを段階的ことができる場合、既存のアプリケーションへの影響を最小限にします。

インデックス:

  1. マイクロサービス間のベスト・デザイン・コール
  2. ApplicationDatabase
  3. ダウンタイムなしで、あなたのデータベーススキーマを更新
  4. 進化データベースの設計
  5. 分散サガを使用してフォールトトレランスとデータ整合性
  6. 分散サガ:Microservicesを調整するためのプロトコル - Caitieマキャフリーを - JOTB17
  7. Microservicesでデータの管理
  8. Microservicesにモノリスを破壊する方法

ブログ記事複数のプラットフォームからこの記事OpenWriteリリース!

おすすめ

転載: www.cnblogs.com/code-craftsman/p/11702814.html