Merancang platform: satu basis data atau banyak basis data?

31

Kami sedang membangun platform web yang menggabungkan beberapa layanan, masing-masing dengan data dasarnya sendiri. Layanan ini sedang dibangun secara independen mengikuti prinsip Arsitektur Berorientasi Layanan , tetapi mereka bertransaksi terhadap data yang berpotensi terkait. Kami sedang mempertimbangkan apakah layanan ini harus berbagi satu basis data besar atau masing-masing memiliki basis data sendiri. (Kami berencana untuk menggunakan SQL Server 2008 Enterprise pada cluster Windows 2008.)

Beberapa keuntungan untuk setiap pendekatan yang telah kami pertimbangkan meliputi:

Database tunggal

  • Menghubungkan data dari berbagai layanan dapat diikat bersama oleh batasan kunci asing
  • Ekstrak analitik lebih mudah ditulis dan dieksekusi lebih cepat
  • Jika terjadi bencana, mengembalikan platform ke kondisi yang konsisten lebih mudah
  • Untuk data yang direferensikan oleh beberapa layanan, data yang di-cache oleh satu layanan kemungkinan akan digunakan segera setelah oleh layanan lain
  • Administrasi dan pemantauan lebih sederhana dan lebih murah di muka

Banyak Database

  • Pekerjaan pemeliharaan, masalah perangkat keras, pelanggaran keamanan dan sebagainya tidak selalu berdampak pada seluruh platform
  • Dengan asumsi setiap basis data berada pada perangkat keras terpisah, meningkatkan beberapa mesin menghasilkan lebih banyak manfaat kinerja daripada meningkatkan satu besar

Dari perspektif operasional, apakah lebih menguntungkan bahwa setiap layanan dalam platform ini mendapatkan basis datanya sendiri, atau bahwa mereka semua masuk dalam database yang sama? Faktor kunci apa yang menginformasikan jawaban untuk pertanyaan ini?

Nick Chammas
sumber
apa yang akhirnya Anda pilih?
Frank Visaggio
@ BobSinclar - Ini beberapa waktu yang lalu sekarang, tapi kami akhirnya menggunakan banyak basis data.
Nick Chammas
Apakah perubahan skema lebih sulit atau tidak? Katakanlah Anda harus memperbarui skema setiap basis data.
Frank Visaggio
@ BobSinclar - Saya bukan yang Anda minta. Kapan Anda perlu memperbarui skema setiap database sekaligus jika Anda telah membangun platform sesuai dengan prinsip-prinsip SOA? Sistem yang berbeda harus digabungkan secara longgar.
Nick Chammas
Saya tahu ini sudah lama, tetapi apakah Anda keberatan berbagi database berbeda yang telah Anda pilih dan alasannya?
azngunit81

Jawaban:

18

Menurut pendapat saya, pembeda utama dari sistem SOA sejati (lebih dari SOA semu, sistem ntier / terdistribusi yang menjadi mana-mana) adalah harus ada nol interaksi antara layanan diskrit. Ketika hal ini tercapai, aplikasi apa pun yang Anda buat dari layanan ini dapat dan harus dibangun untuk mentolerir kegagalan setiap bagian yang konsisten. Kegagalan mengurangi fungsionalitas tetapi layanan tetap dipertahankan.

Dalam skenario ini logis, atau diperlukan, untuk memisahkan basis data yang mendasari untuk setiap layanan. Namun jika Anda memiliki layanan yang saling tergantung, ada sedikit (mungkin tidak ada) yang bisa diperoleh dari split.

Saya akan merekomendasikan membaca situs-situs seperti HighScalability.com yang menggali arsitektur yang diadopsi oleh situs-situs bertipe tidak pernah gagal. Salah satu favorit saya akhir-akhir ini adalah kisah Netflix Chaos Monkey yang disebutkan di Coding Horror .

Mengatasi beberapa poin dalam pertanyaan Anda:

Jika terjadi bencana, mengembalikan platform ke kondisi yang konsisten lebih mudah.

Ini benar tetapi Anda mungkin harus berpikir tentang cara memisahkan layanan ini dengan lebih baik sehingga ini berhenti menjadi masalah. Atau, ada metode untuk memastikan sinkronisasi di beberapa basis data, misalnya tanda transaksi di SQL Server .

Untuk data yang direferensikan oleh beberapa layanan, data yang di-cache oleh satu layanan kemungkinan akan digunakan segera setelah oleh layanan lain.

Solusi cache terdistribusi (memcached et al) dapat membantu di sini tetapi Anda akan melanggar prinsip independensi layanan. Ini akan sebanding dengan memiliki dua layanan berkomunikasi satu sama lain secara langsung, atau lebih buruk lagi memiliki akses layanan lain menyimpan data, melewati antarmuka layanan sama sekali. Tidak dapat dihindari bahwa data akan terkait dan akan diserahkan di antara layanan dengan platform panggilan, keputusan sulit cenderung berada di sekitar layanan mana yang akan memiliki bagian data mana. Situs StackOverflow atau Programmer mungkin lebih baik ditempatkan untuk membantu dengan masalah SOA yang lebih umum.

Dengan asumsi setiap basis data berada pada perangkat keras yang terpisah, meningkatkan skala menghasilkan lebih banyak manfaat kinerja.

Tentu saja bisa lebih murah untuk meningkatkan skala pada beberapa mesin dengan spesifikasi lebih rendah daripada meningkatkan satu mesin. Meskipun, biaya perangkat keras yang lebih rendah dapat dikerdilkan dalam total biaya kepemilikan ketika biaya lunak dari upaya pengembangan tambahan dan kompleksitas operasional diperhitungkan.

Jika ini bukan SOA dan Anda hanya memiliki kasus di mana layanan komponen platform ini sedang dibangun oleh tim / pemasok yang berbeda untuk alasan logistik, tetap dengan database tunggal dan sepenuhnya mengabaikan semua yang di atas! :)

Mark Storey-Smith
sumber
Poin bagus mengenai solusi cache terdistribusi. Dengan caching di tingkat SAN atau basis data, ini bukan masalah. Di sana Anda memperoleh manfaat caching karena topologi penempatan Anda (yaitu layanan yang berbeda kebetulan berbagi perangkat keras yang sama) dan bukan karena komunikasi langsung antara layanan seperti dengan memcached.
Nick Chammas