私はマイクロサービスについて学んでおり、マイクロサービスアーキテクチャを使用してプロジェクトを構築します。
問題は、チームのメンバーの1人がすべてのサービスに1つのデータベースを使用し、すべてのテーブルを共有して「データが繰り返されない」ようにすることです。各サービスはDjango Railsは、非常に異なるORM標準を使用しています。
正しいアプローチは何でしょうか? 1つのデータベースを操作するには、ORMを正しくハッキングするために多くの「ハッキング」が必要だと思います。
すべてのサービスが同じデータベーステーブルを共有している場合、Microservicesアーキテクチャの恩恵を受ける可能性は低くなります。これは、サービスを効果的に密結合しているためです。データベーステーブルが変更された場合、すべてのサービスを変更する必要があります。
Microservicesアーキテクチャの全体的な理由は、開発チーム間の依存関係を減らし、開発チームが高速リリースで独立して前進できるようにすることであることを理解する必要があります。
Amazon CTOであるWerner Vogels(Amazonは多くのMicroservicesスタイルアーキテクチャを開拓した)からの引用です:
私たちにとって、サービス指向とは、公開されたサービスインターフェイスを介した唯一のアクセスを使用して、データを操作するビジネスロジックでデータをカプセル化することを意味します。サービスの外部から直接データベースにアクセスすることはできません。また、サービス間でデータを共有することもできません。
一般に、マイクロサービスは自身のデータに対して責任を負う必要があります。それは完璧な世界シナリオです。
実際には、一部のサービスは相互に関連性が高い場合があります。例えば。 CustomerShippingDetailsおよびCustomerShoppingCheckoutサービスは、両方とも同じデータ(顧客の住所)にアクセスできます。次に、顧客の住所をカスタマーチェックアウトサービスに提供する問題をどのように解決しますか。チェックアウトサービスがショッピングの詳細を直接照会すると、サービス間の疎結合が解除されます。他のオプションは、共有データベースを導入することです。
アーキテクチャには常に何らかの妥協が必要です。犠牲になるのは、全体像(システム全体の設計)に大きく依存するアーキテクチャ上の決定です。
システムに関する詳細が多すぎないため、混合アプローチを使用します。つまり、同様のビジネスロジックを処理するサービス用の共有データベースを持つことです。したがって、CustomerShippingDetailsとCustomerShoppingCheckoutはデータベースを共有できます。ただし、StoreItemsDetailsには個別のデータベースがあります。
Microservice Architecture でマイクロサービスの共有データベースパターンの詳細を確認できます。