Desain microservice multi-tenant

13

Kami sedang dalam proses migrasi aplikasi monolitik ke arsitektur layanan mikro. Karena beberapa persyaratan peraturan, kami harus menyimpan data klien dari berbagai negara dalam basis data terpisah (khusus negara). Yaitu US db untuk pelanggan AS, UK db untuk pelanggan UK ...

Desain-desain berikut yang kami pertimbangkan adalah sebagai berikut:

Opsi 1: Aplikasi multi-penyewa dengan dukungan multi-penyewa berhibernasi yang dapat ditingkatkan ke N beberapa kali tergantung pada permintaan (pikirkan pod kubernet). Satu contoh aplikasi ini akan dapat terhubung ke semua database.

Opsi 2: Menyebarkan instance microservice 1 per basis data negara. Dengan gateway API di depan mereka merutekan lalu lintas

Jika Anda merancang jenis sistem ini, apa pilihan Anda?

Halo Dunia
sumber
3
Saya pikir itu akan tergantung pada apa persyaratan fungsional dan non-fungsional spesifik Anda.
Robert Harvey
Database berbeda tetapi contoh yang sama membacanya? Bukankah itu melanggar persyaratan peraturan juga?
Jimmy T.
Opsi 1 tampaknya tidak terlalu selaras dengan gaya arsitektur Microservices.
Laiv
Anda menyebutkan Kebernetes tetapi tidak jelas apakah Anda menggunakan wadah atau tidak. Jika Anda melakukan ini dengan Docker (misalnya) Anda cukup membuat aplikasi yang menghubungkan ke database. Kemudian ketika Anda memulai wadah dan tentukan detail koneksi melalui parameter dan / atau konfigurasi. Memiliki satu aplikasi yang terhubung ke banyak database sejenis hanya akan menciptakan masalah potensial. Itu tidak menambah sesuatu yang baik untuk desain.
JimmyJames

Jawaban:

4

Saya pikir opsi 2 bukan yang buruk, tetapi mungkin tidak diperlukan. Layanan mikro adalah untuk memungkinkan Anda menangani kebutuhan beberapa aplikasi.

Faktor besar di sini, adalah jika ada perbedaan antara kedua skema, dan jika akan ada di masa depan.

Biasanya, saya pikir menggunakan antarmuka untuk repositori tidak perlu; Namun, mungkin sepadan dengan usaha dalam hal ini. Pabrik repositori akan penting bagi Anda.

Masalah saya dengan opsi 1 adalah terlalu spesifik. Anda harus dapat beralih dari pengaturan yang Anda gambarkan, ke dua instance terpisah yang masing-masing menunjuk ke DB-nya sendiri dengan mudah. Aplikasi TIDAK BISA PERAWATAN DI MANA SAJA MENDAPATKAN DATA PERUSAHAAN.

Meskipun skema tidak berbeda untuk dua database Anda yang berbeda, Anda dapat memiliki satu repositori dengan mudah menangani keduanya, tanpa aplikasi mengetahui perbedaannya:

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);

Jika skema DB menjadi berbeda antara AS dan Inggris, maka Anda kemudian akan membagi fungsionalitas menjadi dua repositori yang sama sekali berbeda. Ini akan mudah, karena yang harus Anda lakukan hanyalah mengganti pabrik Anda.

TheCatWhisperer
sumber
1
Saya tidak mengerti mengapa Anda membutuhkan pabrik ini. Mengapa tidak meneruskan saja ke detail konfigurasi saat startup? Dengan ini, Anda perlu memodifikasi kode setiap kali Anda ingin menambahkan wilayah / negara baru.
JimmyJames
1
Masalahnya di sini adalah tidak berurusan dengan pengguna di negara yang terpisah ... itu berurusan dengan basis data yang berbeda. bagaimana jika ada skema yang berbeda? Mengapa kelas konsumen harus bertanggung jawab untuk mencari tahu di mana mendapatkan string koneksi DB?
TheCatWhisperer
Saya tidak tahu apa yang Anda maksud. Tidak ada dalam kode harus bertanggung jawab untuk 'mencari tahu' di mana mendapatkan string koneksi. Ini konfigurasi. Saya tidak melihat mengapa ini berbeda dari menggunakan konfigurasi untuk database QA vs produksi. Anda tidak memasukkan pernyataan dalam kode untuk itu, bukan?
JimmyJames
Ini adalah satu aplikasi yang berbicara dengan dua basis data.
TheCatWhisperer
Saya pikir Anda salah paham masalah: "kita harus menyimpan data klien dari negara yang berbeda dalam basis data yang terpisah (khusus negara)" Tidak ada persyaratan untuk "contoh" aplikasi tunggal untuk berbicara dengan dua basis data. Saya ragu itu hanya dua DB. OP mungkin berarti "misalnya" ketika mereka mengetik "ie"
JimmyJames
0

Saya akan memilih opsi kedua, ini mengurangi gesekan dalam pengembangan dan penyebaran.

Ini akan memungkinkan skalabilitas dan ketersediaan yang lebih baik dan opsi penerapan downtime nol yang lebih baik, karena Anda mendistribusikan aplikasi Anda ke 1 (atau setidaknya satu) instance per wilayah sebagai lawan dari setidaknya satu untuk seluruh dunia.

Karena persyaratan berubah, Anda mungkin memiliki lebih banyak logika bisnis khusus kawasan dan kemungkinan juga perubahan data, saya akan mencoba dan membagi kode dan datanya per wilayah, dan menghindari berbagi logika bisnis khusus kawasan (Anda mungkin akhirnya berbagi beberapa kode inti).

Masuk akal?

Sean Farmar
sumber