マルチテナントのマイクロサービス設計


13

現在、モノリシックアプリケーションをマイクロサービスアーキテクチャに移行しています。いくつかの規制要件により、異なる国のクライアントのデータを個別の(国固有の)データベースに保管する必要があります。すなわち、米国の顧客のための米国db、英国の顧客のための英国db ...

私たちが検討している次の設計は次のとおりです。

オプション1:必要に応じてN回までスケーリングできる、休止状態のマルチテナントサポートを備えたマルチテナントアプリケーション(kubernetesポッドを考えてください)。このアプリケーションの単一インスタンスは、すべてのデータベースに接続できます。

オプション2:国のデータベースごとに1つのマイクロサービスインスタンスを展開します。APIゲートウェイの前にトラフィックをルーティングする

このタイプのシステムを設計する場合、どのような選択肢がありますか?


3
特定の機能要件と非機能要件が何であるかに依存すると思います。
ロバートハーベイ

異なるデータベースが同じインスタンスがそれを読み取っていますか?それは規制要件にも違反していませんか?
ジミーT.

オプション1は、Microservicesアーキテクチャスタイルとあまり整合していないようです。
ライヴ

Kebernetesについて言及していますが、コンテナを使用しているかどうかは明確ではありません。これをDockerで実行している場合(たとえば)、データベースに接続するアプリを作成するだけです。次に、コンテナを起動し、パラメータや構成を介して接続の詳細を指定します。多くの同様のデータベースに接続する1つのアプリケーションがあるだけで、潜在的な問題が発生します。それはデザインに良いものを追加しません。
ジミージェームズ

回答:


4

オプション2は悪いものではないと思いますが、必要ではないかもしれません。マイクロサービスは、複数のアプリケーションのニーズに対応するためのものです。

ここでの大きな要因は、2つのスキーマに違いがあるかどうか、そして将来あるかどうかです。

通常、リポジトリにインターフェイスを使用する必要はないと思います。ただし、この場合は努力する価値があるかもしれません。リポジトリファクトリは重要です。

オプション1の私の問題は、あまりにも具体的であるということです。説明したセットアップから、それぞれが独自のDBを指す2つの別々のインスタンスに簡単に移動できるはずです。アプリケーションは、データを取得する場所を気にするべきではありません。

スキーマは2つの異なるデータベースで違いはありませんが、1つのリポジトリで両方を簡単に処理できます。アプリケーションは違いを認識しません。

public class MyEntityRepository : ISavesMyEntity, IGetsMyEntity
{
    public MyEntityRepository(string connectionString)
    {
       _connectionString = connectionString;
    }
}

public class MyEntitySaverFactory
{
    public ISavesMyEntity GetSaver(User user)
    {
        if (user.IsUK)
            return new MyEntityRepository(Config.Get("UKConnString"));
        if (user.IsUS)
            return new MyEntityRepository(Config.Get("USConnString"));
        throw new NotImplementedException();
    }
}

//USE
ISavesMyEntity saver = factory.GetSaver(currentUser);
saver.Save(myEntityInstance);

DBスキーマが米国と英国で異なる場合、機能を2つの完全に異なるリポジトリに分割します。あなたがしなければならないのはあなたの工場を変えるだけなので、これは簡単でしょう。


1
この工場が必要な理由がわかりません。起動時に構成の詳細へのパスを渡すだけではどうですか?これにより、新しい地域/国を追加するたびにコードを変更する必要があります。
JimmyJames

1
ここでの問題は、別々の国のユーザーを扱っているのではなく、異なるデータベースを扱っていることです。異なるスキーマがある場合はどうなりますか?DB接続文字列の取得先を把握するのに、消費クラスが責任を負う必要があるのはなぜですか?
TheCatWhisperer

どういう意味かわかりません。接続文字列を取得する場所を「構成する」ためのコードの責任はありません。構成です。これがQAデータベースと本番環境の構成を使用することと異なる理由はわかりません。そのためのコードにif文を入れませんか?
ジミージェームズ

これは、2つのデータベースと通信する1つのアプリケーションです。
TheCatWhisperer

「異なる国のクライアントのデータを別々の(国固有の)データベースに保持する必要がある」という問題を誤解していると思います。1つのアプリケーション「インスタンス」が2つのデータベースと通信する必要はありません。私はそれが2つのDBだとは思わない。彼らは「すなわち」入力されたとき、OPはおそらく、「例えば」を意味し
JimmyJames

0

2番目のオプションを選択すると、開発と展開の摩擦が少なくなります。

これにより、全世界で少なくとも1つではなく、リージョンごとに1つ(または少なくとも1つ)のインスタンスにアプリを配布したため、スケーラビリティと可用性が向上し、ゼロダウンタイムの展開オプションが改善されます。

要件が変更されると、地域固有のビジネスロジックが増え、データも変更される可能性があります。コードとそのデータを地域ごとに分割して、地域固有のビジネスロジックの共有を避けます(最終的にコアコードを共有する場合があります)。

理にかなっていますか?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.