Apakah memiliki fungsionalitas dalam DB merupakan penghalang untuk skalabilitas?

17

Saya mungkin tidak dapat memberikan judul yang tepat untuk pertanyaan itu. Tapi ini dia,

Kami sedang mengembangkan portal keuangan untuk manajemen kekayaan. Kami mengharapkan lebih dari 10.000 klien untuk menggunakan aplikasi ini. Portal menghitung berbagai analisis kinerja berdasarkan analisis teknis pasar saham.

Kami mengembangkan banyak fungsi melalui prosedur Tersimpan, fungsi yang ditentukan pengguna, pemicu, dll melalui Database. Kami pikir kami bisa mendapatkan peningkatan kinerja besar melakukan hal-hal secara langsung dalam database daripada melalui kode C #. Dan kami benar-benar mendapatkan peningkatan kinerja yang sangat besar.

Ketika saya mencoba untuk menyombongkan pencapaian CTO kami, dia mempertanyakan keputusan saya untuk mengimplementasikan fungsionalitas dalam database daripada kode. Menurutnya aplikasi tersebut mengalami masalah skalabilitas. Dalam kata-katanya "Hari-hari ini hal-hal disimpan dalam memori / cache. Data cluster sulit dikelola dari waktu ke waktu. Facebook, Google tidak memiliki apa-apa dalam database. Ini adalah era server yang tipis dan klien yang tebal. DB hanya digunakan untuk menyimpan data biasa dan fungsionalitas harus sepenuhnya dipisahkan dari database. "

Bisakah kalian tolong beri saya beberapa saran, apakah apa yang dia katakan benar. Bagaimana dengan arsitek aplikasi semacam itu?

Estefany Velez
sumber
3
"Dan kami benar-benar mendapatkan peningkatan kinerja yang sangat besar" dibandingkan dengan apa? Ketika Anda tidak pernah menerapkan fungsi yang sama pada klien, bagaimana Anda tahu?
Doc Brown
3
Saya pikir itu akan menjadi biasa - itu tergantung pada proyek, implementasi data dan keterampilan tim.
Daniel Iankov
1
Anda harus bertanya kepada CTO Anda apa yang membuatnya berpikir bahwa basis data tidak menggunakan teknik yang disukainya dan mengapa prosedur tersimpan tidak memenuhi syarat sebagai "kode".
Blrfl
3
Facebook dan Google memiliki masalah pada skala yang sama sekali berbeda dengan sebagian besar aplikasi - mungkin ada masalah dengan jumlah data yang harus Anda hadapi dalam hal data dari pasar tetapi database SQL kontemporer dibangun untuk mengatasi jumlah data yang mengejutkan.
Murph
1
Saya mungkin berpikir dengan cara yang sama seperti CTO Anda kecuali Anda dapat membuktikan kinerja solusinya tidak cukup dan tidak ada cara lain untuk mengelolanya. Prosedur tersimpan, terutama ketika jumlahnya menjadi besar, menyebabkan penghalang yang luar biasa untuk pindah ke DB lain jika diperlukan ... tidak dapat memprediksi masa depan.
Rig

Jawaban:

23

Singkatnya, saya setuju dengan CTO Anda. Anda mungkin mendapatkan beberapa kinerja dengan mengorbankan skalabilitas (jika persyaratan tersebut membingungkan, saya akan menjelaskan di bawah). Dua kekhawatiran terbesar saya adalah pemeliharaan dan kurangnya opsi untuk menskalakan secara horizontal (dengan asumsi Anda akan membutuhkannya).

Kedekatan dengan data: Mari kita mundur. Ada beberapa alasan bagus untuk memasukkan kode ke dalam DB. Saya berpendapat bahwa yang terbesar adalah kedekatan dengan data - misalnya, jika Anda mengharapkan perhitungan mengembalikan sejumlah nilai, tetapi ini adalah kumpulan dari jutaan rekaman, mengirimkan jutaan rekaman (sesuai permintaan) melalui jaringan yang akan dikumpulkan di tempat lain sangat boros, dan dapat membunuh sistem Anda dengan mudah. Setelah mengatakan ini, Anda bisa mencapai kedekatan data ini dengan cara lain, pada dasarnya menggunakan cache atau DB analisis di mana beberapa agregasi dilakukan dimuka.

Performa kode dalam DB:Efek kinerja sekunder, seperti "caching rencana eksekusi" lebih sulit untuk diperdebatkan. Terkadang, rencana eksekusi yang di-cache bisa menjadi hal yang sangat negatif, jika rencana eksekusi yang salah di-cache. Bergantung pada RDBMS Anda, Anda mungkin mendapatkan yang terbaik dari ini, tetapi Anda tidak akan mendapatkan terlalu banyak dari parametrised SQL, dalam banyak kasus (rencana tersebut biasanya di-cache juga). Saya juga berpendapat bahwa sebagian besar bahasa yang dikompilasi atau JIT'ed biasanya berkinerja lebih baik daripada setara SQL mereka (seperti T-SQL atau PL / SQL) untuk operasi dasar dan pemrograman non-relasional (manipulasi string, loop, dll), jadi Anda tidak akan akan kehilangan apa pun di sana, jika Anda menggunakan sesuatu seperti Java atau C # untuk melakukan angka-angka. Optimalisasi berbutir halus juga cukup sulit - pada DB, Anda sering terjebak dengan pohon-B generik (indeks) sebagai satu-satunya struktur data Anda. Agar adil, analisis lengkap, termasuk hal-hal seperti memiliki transaksi yang berjalan lebih lama, eskalasi kunci, dll, dapat mengisi buku.

Maintainability: SQL adalah bahasa yang luar biasa untuk apa ia dirancang untuk dilakukan. Saya tidak yakin ini sangat cocok untuk logika aplikasi. Sebagian besar perkakas dan praktik yang membuat hidup kita tertahankan (TDD, refactoring, dll) sulit diterapkan pada pemrograman basis data.

Kinerja versus skalabilitas:Untuk memperjelas persyaratan ini, maksud saya ini: kinerja adalah seberapa cepat Anda akan mengharapkan satu permintaan untuk melalui sistem Anda (dan kembali ke pengguna), untuk saat ini dengan asumsi beban rendah. Ini akan sering dibatasi oleh hal-hal seperti jumlah lapisan fisik yang dilaluinya, seberapa baik lapisan tersebut dioptimalkan, dll. Skalabilitas adalah bagaimana perubahan kinerja dengan meningkatnya jumlah pengguna / beban. Anda mungkin memiliki kinerja sedang / rendah (katakanlah, 5 detik + untuk permintaan), tetapi skalabilitas luar biasa (dapat mendukung jutaan pengguna). Dalam kasus Anda, Anda mungkin akan mengalami kinerja yang baik, tetapi skalabilitas Anda akan dibatasi oleh seberapa besar server yang dapat Anda bangun secara fisik. Pada titik tertentu, Anda akan mencapai batas itu, dan dipaksa untuk beralih ke hal-hal seperti sharding, yang mungkin tidak layak tergantung pada sifat aplikasi.

Optimasi Prematur: Pada akhirnya, saya pikir Anda telah membuat kesalahan dengan mengoptimalkan secara prematur. Seperti yang telah ditunjukkan orang lain, Anda tidak benar-benar memiliki pengukuran yang menunjukkan bagaimana pendekatan lain akan bekerja. Ya, kami tidak selalu dapat membuat prototipe skala penuh untuk membuktikan atau membantah teori ... Tapi secara umum, saya selalu ragu untuk memilih pendekatan yang memperdagangkan perawatan (mungkin kualitas aplikasi yang paling penting) untuk kinerja .

EDIT: Pada catatan positif, penskalaan vertikal dapat meregang cukup jauh dalam beberapa kasus. Sejauh yang saya tahu, SO berlari pada satu server untuk beberapa waktu. Saya tidak yakin bagaimana ini cocok dengan 10.000 pengguna Anda (saya kira itu akan tergantung pada sifat apa yang mereka lakukan di sistem Anda), tetapi ini memberi Anda gambaran tentang apa yang dapat dilakukan (sebenarnya, ada jauh contoh yang lebih mengesankan, ini hanya menjadi populer yang mudah dimengerti orang).

EDIT 2: Untuk mengklarifikasi dan mengomentari beberapa hal yang diangkat di tempat lain:

  • Re: Konsistensi atom - Konsistensi ACID mungkin menjadi persyaratan sistem. Di atas tidak benar-benar membantah hal itu, dan Anda harus menyadari bahwa konsistensi ACID tidak mengharuskan Anda untuk menjalankan semua logika bisnis Anda di dalam DB. Dengan memindahkan kode yang tidak perlu ada di dalam DB, Anda membatasi untuk berjalan di lingkungan fisik sisa DB - itu bersaing untuk sumber daya perangkat keras yang sama dengan bagian manajemen data aktual dari DB Anda. Adapun hanya mengubah kode ke server DB lain (tetapi bukan data aktual) - tentu saja, ini mungkin terjadi , tetapi apa sebenarnya yang Anda peroleh di sini, selain dari biaya lisensi tambahan dalam banyak kasus? Simpan hal-hal yang tidak perlu pada DB, dari DB.
  • Re: SQL / C # kinerja - karena ini tampaknya menjadi topik yang menarik, mari kita tambahkan sedikit ke diskusi. Anda tentu dapat menjalankan kode asli / Java / C # di dalam DB, tetapi sejauh yang saya tahu, bukan itu yang sedang dibahas di sini - kami membandingkan penerapan kode aplikasi yang khas dalam sesuatu seperti T-SQL versus sesuatu seperti C #. Ada sejumlah masalah yang sulit dipecahkan dengan kode relasional di masa lalu - mis. Pertimbangkan masalah "login bersamaan maksimum", di mana Anda memiliki catatan yang menunjukkan login atau keluar, dan waktu, dan Anda perlu mencari tahu apa yang jumlah maksimum pengguna yang masuk pada suatu waktu adalah. Solusi paling sederhana yang mungkin adalah untuk beralih melalui catatan dan terus menambah / mengurangi penghitung saat Anda menemukan login / logout, dan melacak maksimum nilai ini.mungkin, Saya tidak tahu), yang terbaik yang dapat Anda lakukan adalah CURSOR (solusi relasional murni semuanya pada urutan kompleksitas yang berbeda, dan mencoba menyelesaikannya menggunakan perulangan sementara menghasilkan kinerja yang lebih buruk). Dalam hal ini, ya, solusi C # sebenarnya lebih cepat dari apa yang dapat Anda capai di T-SQL, titik. Itu mungkin tampak tidak masuk akal, tetapi masalah ini dapat dengan mudah memanifestasikan dirinya dalam sistem keuangan, jika Anda bekerja dengan baris yang mewakili perubahan relatif, dan perlu menghitung agregasi berjendela tentang hal itu. Doa proc tersimpan juga cenderung lebih mahal - gunakan SP sepele satu juta kali dan lihat bagaimana membandingkannya dengan memanggil fungsi C #. Saya mengisyaratkan beberapa contoh lain di atas - saya belum menemukan orang yang mengimplementasikan tabel hash yang tepat di T-SQL (yang sebenarnya memberikan beberapa manfaat), sementara itu cukup mudah dilakukan di C #. Sekali lagi, ada hal-hal yang membuat DBs luar biasa, dan hal-hal yang mereka tidak begitu mengagumkan. Sama seperti saya tidak ingin melakukan GABUNGAN, SUM dan GROUP BYs dalam C #, saya tidak ingin menulis apa pun terutama CPU intensif di T-SQL.
Daniel B
sumber
Salah satu alasan saya cenderung mendorong fungsionalitas ke database adalah bahwa kereta jauh lebih sedikit daripada kode tingkat aplikasi. SQL bersifat deklaratif dan tidak menderita banyak masalah yang dilakukan oleh bahasa imperatif.
wobbily_col
Mengenai rawatan, menggunakan rawatan Alat Data SQL Server sangat mudah. Bahkan untuk database nontrivial (satu dengan lebih dari 5 tabel) saya akan menganggapnya sebagai persyaratan.
Jon49
4

Skalabilitas tidak ada hubungannya dengan di mana data berada atau bagaimana perhitungan terjadi. Skalabilitas adalah semua tentang bagaimana Anda mengelola keadaan global dan saling ketergantungan data. Jika arsitektur Anda berbelit-belit dengan semua jenis data saling ketergantungan maka tidak masalah di mana Anda meletakkan kode untuk mengubah data itu. Inter-dependensi akan memaksa tangan Anda dan mengurangi potensi untuk scaling sesuatu. Jika di sisi lain data Anda longgar digabungkan dan sangat sedikit atau tidak ada keadaan global maka sekali lagi tidak masalah di mana perhitungan terjadi. Melakukan penskalaan akan jauh lebih mudah.

Saya tidak yakin dari mana CTO Anda mendapatkan informasi tentang masalah skalabilitas tetapi dari apa yang Anda katakan itu tidak terdengar seperti dia memiliki alasan nyata untuk mempertanyakan keputusan arsitektur saat ini selain tren mode perangkat lunak. Mendasarkan keputusan arsitektur pada tren seperti itu biasanya merupakan ide yang buruk.

davidk01
sumber
1
+1 untukScalability is all about how you manage global state and data inter-dependence.
Estefany Velez
2

Dan kami benar-benar mendapatkan peningkatan kinerja yang sangat besar.

Saya pikir Anda perlu menetapkan tolok ukur kinerja dan mulai membangun prototipe Anda terlebih dahulu. Menjaga semua logika dalam DB adalah sekolah lama (imho, saya tidak menentangnya) berurusan dengan arsitektur client-server. Meskipun memiliki kelebihan, ada beberapa kekurangan yang perlu dipertimbangkan.

Pendekatan biasa untuk jenis aplikasi yang dapat dijual ini dilakukan melalui SOA . Karena dalam jangka panjang, ini adalah cara termudah untuk menambahkan aplikasi klien baru ke proyek Anda.

Anda juga menyebutkan pemicu. Pemicu penggunaan mungkin berubah menjadi Gotchas besar nanti dalam siklus hidup dukungan aplikasi, saya akan menjadi dua kali lipat hati-hati dengan itu, dan bahkan mencoba untuk melewatkan penggunaannya.

Yusubov
sumber
2

CTO Anda 100% salah.

Nomor Keuangan Anda HARUS bertambah setiap saat. Itu berarti Anda memerlukan ACID dan DB relasional adalah tempat terbaik untuk memastikan itu. Keuntungan kinerja NoSql DB biasanya dengan biaya ACID dan itu OK untuk Google dan Facebook TAPI TIDAK untuk sistem yang mengandung keuangan.

Mengatakan bahwa C # berkinerja lebih baik daripada kode SQL juga merupakan kebodohan ...

Orang bodoh
sumber
Untuk mengatakan bahwa C # berkinerja lebih baik daripada kode SQL juga merupakan kebodohan ... - Tapi Anda tidak menyangkal bahwa kode C # lebih terukur, benar?
Jim G.
Tidak ada yang lebih scalable, Karena itu bukan di mana leher botol, saya dapat skala kode Sql (bukan data) secara horizontal semudah saya dapat secara horizontal skala kode C #.
Moron
@ Jim. Hanya untuk memperjelas, "Saya dapat skala kode Sql (bukan data) secara horizontal semudah saya dapat secara horizontal skala kode C #" jika dirancang untuk melakukannya ... Sama seperti C # itu harus dirancang untuk skala. Anda tidak bisa hanya mengatakan skala C lebih baik, ini masalah perencanaan bukan bahasa.
Morons
@ Jimg .: Perangkat lunak yang tidak memiliki skala dapat ditulis dalam bahasa apa pun, termasuk C #. Basis data apa pun yang berharga dapat memiliki prosedur tersimpan yang ditulis dalam bahasa selain dari implementasi SQL-ish asli mereka, dan orang-orang yang terlibat dengan NoSQL dalam situasi yang membutuhkan ACID biasanya akhirnya menciptakan kembali sebagian besar roda yang telah dibuat dengan baik. diimplementasikan oleh DBMS.
Blrfl
@Morons: Saya pikir kami setuju. Saya adalah sebenarnya conflating data dengan "SQL". Jauh lebih mahal untuk skala database.
Jim G.
2

Kapan saja ada yang menyebutkan skalabilitas dan Google / Facebook / Twitter / dll, itu adalah herring merah. Kecuali Anda pada dasarnya menyediakan layanan yang sama, apa yang cocok untuk mereka mungkin tidak sesuai untuk Anda. Secara umum, jika Anda dapat menskalakan dari satu mesin ke satu klaster delapan mesin, Anda mungkin telah mencakup semua pangkalan Anda. Kecuali jika Anda memiliki persyaratan bisnis yang keras untuk melayani tampilan halaman 20M sehari, jangan khawatir tentang penskalaan hiper. Lakukan apa yang masuk akal untuk persyaratan nyata aplikasi Anda , dan khawatir tentang peningkatan ketika itu menjadi jelas Anda perlu. Dan jangan lupa, sebagian besar server basis data dapat dikelompokkan juga, jadi hanya karena itu semua dalam satu basis data tidak berarti itu ada di satu server.

TMN
sumber