すべてのユーザーの関連ロジックを保持する「ユーザー」マイクロサービスを想像してください。このマイクロサービスはデータベースを保持します。
このマイクロサービスを水平にスケーリングして一貫性を保つにはどうすればよいですか?
実際、だけ別のインスタンスを追加すると、1人のユーザーが作成、更新、または削除された場合、操作は1つのインスタンスにのみ適用され、結果として一貫性が失われます。
水平方向にスケーリングして一貫性を保つことができる最も便利な方法は何ですか?
TL; DR
まず、Webフロントエンドは実際にはステートフルであってはなりません。彼らはあなたが失うことが許されないものを保存するべきではありませんいつでも。すべてのデータは、専用のデータベースクラスターに存在する必要があります。誰かのセッションやデータを壊すことなく、Webフロントエンドをゴミ箱に入れたり、新しいフロントエンドを追加したりできるはずです。スケーリングthatは「自明」でなければなりません。
つまり、サービスのデータベースを水平方向にスケーリングするには、何らかの sharding が必要です。ただし、 document-type store を選択した場合、シャーディングによる水平方向のスケーリングは 通常は機能のベイク であり、構成する必要があります。 (または、DynamoDBなどのスケーラブルなデータベースホスティングサービスを使用している場合は、完全に無視できる詳細です。)
基本的に、シャーディングでは、ノード間でデータを分割する方法を決定するために使用されるフィールドを識別する必要があります。 user_id
、これは数値に変換されます。特定のユーザーレコードがどのデータベースノードに格納されるかは、たとえば、そのIDとハッシュアルゴリズムによって異なる場合があります。
本当に基本的な例は、ランダムで整数のようなユーザーIDの係数です。あなたが取る user_id % number_of_servers
レコードを保存/取得する場所を決定します。
Nosqlデータベースを使用すると、これがどのように行われるかについての多くの詳細が処理されます。クラスターにアクセスするだけで、何をすべきかがわかります。
[〜#〜] acid [〜#〜] のようなコンプライアンスが必要な場合は、より洗練された戦略があります。
とはいえ、microサービスの利点の1つは、このスケーラビリティの問題の遅延です。つまり、userデータベースは、製品カタログおよびordersとは異なるためです。データベースなどの場合、これらの各データベースはすでに別のホストに配置できます。トラフィックはすでにいくらか分散されています。
本当に大規模で非営利的なサービスを実行している場合を除き、残りのスケーラビリティ作業は、対応する予算ができるまで延期することができます。
スケーラビリティのために、各サービスはステートレスであり、したがって任意にスケーリングできるという前提があります。ここでステートレスとは、すべての状態が外部のデータベースに格納されることを意味します。このビューでは、マイクロサービスは、使用するデータベースとは多少分離しています。特に、サービスの複数のインスタンスをデプロイしても、1つの共有データベースがある場合があります。
API users
|
Load balancing
/ | \
MS MS ... MS
\ | /
Shared Database
その設計では、データベースはすぐには拡張できません。この設計はマイクロサービスを必要としないことにも注意してください。プロセスに内部状態がない限り、モノリシック設計からまったく同じスケーラビリティのメリットを得られます。
一貫性を維持したい場合、データベースのスケーリングは困難です。別のインスタンスを起動するだけでは効果がありません。典型的な解決策は、一貫性をあきらめるか、垂直スケーリングを使用することです:より強力なサーバーでDBを実行します。多くの場合、データベースにリードレプリカを追加することで、すでにかなりの効果があります。また、データウェアハウジング技術を使用すると、運用データベースの負荷を軽減できます。マイクロサービスはわずかに役立ちます。マイクロサービスごとに異なるデータベースを使用できるため、各マイクロサービスのデータベースを個別にスケーリングできるためです。