web-dev-qa-db-ja.com

マイクロサービス:インスタンスごとまたはマイクロサービスごとのデータソース?

マイクロサービスアーキテクチャの構築同じマイクロサービスのインスタンス間でのデータ共有の問題に直面しました。

私はマイクロサービスを持っています。それはそのデータソースを大量に使用します-サービスへのすべてのリクエストはデータベースリクエストを引き起こします(通常は挿入)。このサービスは非常に頻繁に使用されるため、ロードバランサーの背後に複数のインスタンスを非表示にする予定です。そして、ここで疑問が生じます。これらのインスタンスは1つのデータベース(データベースがボトルネックになるのでしょうか)を使用するのでしょうか、それとも複数(インスタンスごとのデータソース)で使用するのでしょうか。

20
ovnia

MSOAアーキテクチャの経験では、これまで見たことがありません。

MULTIPLE(インスタンスごとのデータソース)

使用する。大量のロードを計画している場合でも、最も一般的なDBは本質的にマルチスレッドアクセスをサポートしています。通常、DBシステムのボトルネック(または最も遅い部分)はディスクです。クラスターを数回スケーリングする必要がありました(クラウドを使用している場合は比較的安価ですが、スケーリングされたDBシステムを管理および実行するためにより多くのスレッドが必要になるため、スケーラビリティも問題になる可能性があります)。一部のRDBMSは、そのインスタンス上のすべてのDBが並べ替え、ハッシュ、一時変数などに使用する一時DB(tempdb)を使用することに注意してください。このtempdbファイルのマルチスレッド化と分割を使用して、tempdbのスループットを向上させることができます。 、それによってサーバー全体のパフォーマンスが向上します。

今私は Orchard で作業しているので、1つのインスタンスでのアクションが完全に(そしてタイムリーに)同期されていない場合、いくつかのコーナーケースがあると言わざるを得ません。これにより、正しい認証を行った後でも、リソースへのアクセスが拒否されます(イベントの登録直後)。

ロードバランサーの背後に複数のインスタンスを非表示にする予定です

これはアプリケーションサーバーにとって適切な設計であるため、DBクラスターを利用することも適しているはずです。完全な答えを目指して-あなたは考えることができます [〜#〜] dwh [〜#〜] あなたがたくさんのサービスを持っていて、すべてからいくつかのデータマイニングと分析をしたい場合彼らのDB。

10
ekostadinov

マイクロサービスインスタンスごとに1つのデータベースインスタンスを持つことは、非常に珍しいアーキテクチャです。データベースの負荷が心配な場合は、データベースをクラスター化してスループットを高めることができますが、挿入による負荷はそれほど大きくありません。

データベースがボトルネックになっていることが心配な場合は、NoSQLデータベースを調べることをお勧めします。 NoSQLデータベースは、高スループットのために拡張性が高く、大量のデータを適切に処理するように設計されています。もちろん、欠点は、複雑なデータモデルをうまく処理できないことです。

7
drhender

私のアプローチは、サービスローカルDBです(読み取り:インスタンスごとのデータソース)。メモリ内または同じポッド内。起動時に常に新しいDBを同期するには、ApacheKafkaを使用します。サービスが初期化を開始するとすぐに、関心のあるすべてのエントリについてKafkaを照会します(コンパクトログ-最近の状態のみを返すKafkaの機能に注意してください)エンティティの)DBにデータを入力し、リクエストの処理を開始します。

これはもちろん起動時間を増やしますが、利点は、DBがサービスが望む任意の技術またはスキームである可能性があることです(これはサービスのバージョンごとに変わる可能性もあります)。また、DBクラスターは必要ありませんが、適切に構成されたKafka-Serviceが必要ですが、サービス間のイベントソーシングにも使用できます。

2
sschrass

これは、実際にはスケーラビリティ要件と、マイクロサービスインスタンスが単一の結果を提供するために協力する必要があるかどうかによって異なります。トレードオフが何であるかを知るのに役立ちます:

すべてを1つのデータベースに保持する

  • より簡単な構成

  • サービスの他のインスタンスとの調整や通信は必要ありません

  • 完全なデータセットを簡単に見つけることができます
  • データベースのパフォーマンスによって制限されるシステムパフォーマンス

データベースを分離しておく

  • リクエストの完全な回答はマイクロサービスインスタンス全体に広がる可能性がありますその場合、リクエストを解決するための通信とネゴシエーションが増加しますそのマイクロサービスノードを失うとデータを処理します(データベースがまだ稼働している場合でも、データベースがまだ稼働している場合でも、それを取得することはできません)適切な構成の新しいものがバックアップされます)

  • 構成の複雑さの増加

1
Devender Goyal

多くは実際のユースケースによって異なりますが、ライトビハインドまたはライトバックが解決策の1つになると思います。 This リンクはEhCacheを使用した手法について説明しています。この機能をサポートする他のキャッシュがあるはずですが、少しググってみてください。

1
User2709