Tetapi apakah itu benar-benar penting? Pertimbangkan bahwa UI harus membuat panggilan jaringan ke API; itu cukup besar (urutan besarnya milidetik). Database dioptimalkan untuk menjaga hal-hal dalam memori dan mengeksekusi membaca sangat, sangat cepat (mis. SQL Server memuat dan menyimpan semuanya dalam RAM dan mengkonsumsi hampir semua RAM gratis Anda jika bisa).
Logika
Secara teori, Anda benar. Namun, ada beberapa kelemahan dengan alasan ini:
Dari apa yang Anda nyatakan, tidak jelas apakah Anda benar-benar menguji / membuat profil aplikasi Anda. Dengan kata lain, apakah Anda benar - benar tahu bahwa transfer jaringan dari aplikasi ke API adalah komponen yang paling lambat? Karena itu intuitif, mudah untuk menganggap itu. Namun, ketika membahas kinerja, Anda tidak boleh berasumsi. Di perusahaan saya, saya yang memimpin kinerja. Ketika saya pertama kali bergabung, orang-orang terus berbicara tentang CDN, replikasi, dll berdasarkan intuisi tentang apa yang harus menjadi hambatan. Ternyata, masalah kinerja terbesar kami adalah kueri basis data yang berkinerja buruk.
Anda mengatakan bahwa karena basis data bagus dalam mengambil data, bahwa basis data harus berjalan pada kinerja puncak, digunakan secara optimal, dan tidak ada yang dapat dilakukan untuk memperbaikinya. Dengan kata lain, database dirancang untuk menjadi cepat, jadi saya tidak perlu khawatir tentang hal itu. Garis pemikiran berbahaya lainnya. Itu seperti mengatakan mobil dimaksudkan untuk bergerak cepat, jadi saya tidak perlu mengganti oli.
Cara berpikir ini mengasumsikan satu proses pada satu waktu, atau dengan kata lain, tanpa konkurensi. Diasumsikan bahwa satu permintaan tidak dapat memengaruhi kinerja permintaan lainnya. Sumber daya dibagikan, seperti disk I / O, bandwidth jaringan, kumpulan koneksi, memori, siklus CPU, dll. Oleh karena itu, mengurangi satu panggilan database menggunakan sumber daya bersama dapat mencegahnya menyebabkan permintaan lain melambat. Ketika saya pertama kali bergabung dengan majikan saya saat ini, manajemen percaya bahwa menyetel kueri basis data 3 detik adalah buang-buang waktu. 3 detik sangat sedikit, mengapa membuang waktu? Bukankah kita akan lebih baik dengan CDN atau kompresi atau yang lainnya? Tetapi jika saya dapat membuat kueri 3 detik berjalan dalam 1 detik, katakanlah dengan menambahkan indeks, yaitu 2/3 lebih sedikit pemblokiran, 2/3 lebih sedikit waktu yang dihabiskan untuk menempati utas, dan yang lebih penting, lebih sedikit data yang dibaca dari disk,
Teori
Ada konsep umum bahwa kinerja perangkat lunak hanya tentang kecepatan .
Dari perspektif kecepatan murni, Anda benar. Suatu sistem hanya secepat komponennya yang paling lambat. Jika Anda telah membuat profil kode Anda dan menemukan bahwa Internet adalah komponen yang paling lambat, maka yang lainnya jelas bukan bagian yang paling lambat.
Namun, mengingat hal di atas, saya harap Anda dapat melihat bagaimana pertentangan sumber daya, kurangnya pengindeksan, kode yang ditulis dengan buruk, dll. Dapat menciptakan perbedaan kinerja yang mengejutkan.
Asumsinya
Satu hal terakhir. Anda menyebutkan bahwa panggilan basis data harus murah dibandingkan dengan panggilan jaringan dari aplikasi ke API. Tetapi Anda juga menyebutkan bahwa aplikasi dan server API berada di LAN yang sama. Karena itu, bukankah keduanya sebanding dengan panggilan jaringan? Dengan kata lain, mengapa Anda mengasumsikan bahwa transfer API adalah urutan besarnya lebih lambat daripada transfer basis data ketika mereka berdua memiliki bandwidth yang tersedia yang sama? Tentu saja protokol dan struktur datanya berbeda, saya mengerti, tetapi saya membantah anggapan bahwa mereka adalah urutan besarnya berbeda.
Di mana itu mendapat murkey
Seluruh pertanyaan ini adalah tentang panggilan basis data "banyak" versus "tunggal". Tetapi tidak jelas berapa banyak yang multipel. Karena apa yang saya katakan di atas, sebagai aturan umum, saya sarankan membuat panggilan database sesedikit mungkin. Tapi itu hanya aturan praktis.
Inilah alasannya:
- Database hebat dalam membaca data. Mereka adalah mesin penyimpanan. Namun, logika bisnis Anda tinggal di aplikasi Anda. Jika Anda membuat aturan bahwa setiap panggilan API menghasilkan tepat satu panggilan basis data, maka logika bisnis Anda mungkin berakhir di basis data. Mungkin itu baik-baik saja. Banyak sistem melakukan itu. Tetapi beberapa tidak. Ini tentang fleksibilitas.
- Terkadang untuk mencapai decoupling yang baik, Anda ingin memisahkan 2 panggilan basis data. Misalnya, mungkin setiap permintaan HTTP dialihkan melalui filter keamanan umum yang memvalidasi dari DB bahwa pengguna memiliki hak akses yang tepat. Jika ya, lanjutkan untuk menjalankan fungsi yang sesuai untuk URL itu. Fungsi itu dapat berinteraksi dengan database.
- Memanggil basis data dalam satu lingkaran. Inilah mengapa saya bertanya berapa banyak yang multipel. Dalam contoh di atas, Anda akan memiliki 2 panggilan basis data. 2 baik-baik saja. 3 mungkin baik-baik saja. N tidak baik. Jika Anda memanggil basis data dalam satu lingkaran, Anda sekarang telah membuat kinerja linier, yang berarti akan lebih lama semakin banyak yang ada dalam input loop. Jadi dengan tegas mengatakan bahwa waktu jaringan API adalah yang paling lambat benar-benar mengabaikan anomali seperti 1% dari lalu lintas Anda memerlukan waktu lama karena loop belum ditemukan yang memanggil database 10.000 kali.
- Terkadang ada beberapa hal yang lebih baik di aplikasi Anda, seperti beberapa perhitungan yang rumit. Anda mungkin perlu membaca beberapa data dari database, melakukan beberapa perhitungan, kemudian berdasarkan hasil, meneruskan parameter ke panggilan database kedua (mungkin untuk menulis beberapa hasil). Jika Anda menggabungkannya menjadi satu panggilan (seperti prosedur tersimpan) hanya untuk memanggil basis data sekali saja, Anda telah memaksakan diri untuk menggunakan basis data untuk sesuatu yang mungkin lebih baik digunakan oleh server aplikasi.
- Load balancing: Anda memiliki 1 database (mungkin) dan beberapa server aplikasi yang seimbang. Oleh karena itu, semakin banyak pekerjaan yang dilakukan aplikasi dan semakin sedikit basis data, semakin mudah untuk mengukur karena umumnya lebih mudah untuk menambahkan server aplikasi daripada membuat replikasi database. Berdasarkan poin-poin sebelumnya, mungkin masuk akal untuk menjalankan kueri SQL, kemudian melakukan semua perhitungan dalam aplikasi, yang didistribusikan di beberapa server, dan kemudian menulis hasilnya setelah selesai. Ini bisa memberikan hasil yang lebih baik (bahkan jika keseluruhan waktu transaksi adalah sama).
TL; DR
TLDR: Apakah benar-benar penting untuk khawatir tentang beberapa panggilan basis data ketika kita sudah melakukan panggilan jaringan melalui LAN? Jika demikian, mengapa?
Ya, tetapi hanya sampai batas tertentu. Anda harus mencoba meminimalkan jumlah panggilan basis data saat praktis, tetapi jangan gabungkan panggilan yang tidak ada hubungannya satu sama lain hanya untuk menggabungkannya. Juga, hindari memanggil basis data dalam satu lingkaran di semua biaya.