Ama bu gerçekten önemli mi? Kullanıcı arayüzünün API'ye bir ağ çağrısı yapması gerektiğini düşünün; bu oldukça büyük (milisaniye büyüklük sırası). Veritabanları işleri bellekte tutmak ve okumaları çok, çok hızlı bir şekilde yürütmek için optimize edilmiştir (örn. SQL Server her şeyi RAM'de yükler ve tutar ve mümkünse neredeyse tüm ücretsiz RAM'inizi tüketir).
Mantık
Teorik olarak haklısınız. Bununla birlikte, bu mantıkla birkaç kusur vardır:
Belirttiğinize göre, uygulamanızı gerçekten test edip profillendirdiğiniz belli değil. Başka bir deyişle, aslında yok biliyorum API uygulamadan ağ transferleri yavaş bileşen olduğuna? Bu sezgisel olduğu için olduğunu varsaymak kolaydır. Ancak, performansı tartışırken asla varsaymamalısınız. İşverenimde performans lideriyim. İlk katıldığımda, insanlar darboğazların ne olması gerektiğine dair sezgiye dayanarak CDN'ler, çoğaltma vb. Hakkında konuşmaya devam ettiler. Görünüşe göre, en büyük performans sorunlarımız veritabanı sorgularını kötü bir şekilde gerçekleştiriyordu.
Veritabanları veri almada iyi olduğu için, veritabanının mutlaka en yüksek performansta çalıştığını, en iyi şekilde kullanıldığını ve bunu iyileştirmek için yapılabilecek hiçbir şeyin olmadığını söylüyorsunuz. Başka bir deyişle, veritabanları hızlı olacak şekilde tasarlanmıştır, bu yüzden asla endişelenmemeliyim. Bir başka tehlikeli düşünce tarzı. Bu, bir arabanın hızlı hareket etmesi gerektiğini söylemek gibidir, bu yüzden yağı değiştirmem gerekmiyor.
Bu düşünce tarzı bir seferde tek bir süreç varsayar ya da başka bir deyişle eşzamanlılık olmaz. Bir isteğin başka bir isteğin performansını etkileyemeyeceğini varsayar. Disk G / Ç, ağ bant genişliği, bağlantı havuzları, bellek, CPU döngüleri, vb. Gibi kaynaklar paylaşılır. Bu nedenle, bir veritabanı çağrısının paylaşılan kaynak kullanımını azaltması, diğer isteklerin yavaşlamasına neden olabilir. Mevcut işverenime ilk katıldığımda, yönetim 3 saniyelik bir veritabanı sorgusunun ayarlanmasının zaman kaybı olduğuna inanıyordu. 3 saniye çok az, neden harcanan zaman? Bir CDN veya sıkıştırma veya başka bir şeyle daha iyi olmaz mıydık? Ama 1 saniyede 3 saniyelik bir sorgu yapabilirsem, örneğin bir dizin ekleyerek 2/3 daha az engelleme, bir iş parçacığını işgal etmek için 2/3 daha az zaman ve daha da önemlisi, diskten daha az veri okuma,
Teori
Yazılım performansının sadece hız ile ilgili olduğu konusunda ortak bir görüş vardır .
Tamamen hız açısından, haklısınız. Bir sistem ancak en yavaş bileşeni kadar hızlıdır. Kodunuzu oluşturduysanız ve İnternet'in en yavaş bileşen olduğunu tespit ettiyseniz, her şey açıkçası en yavaş kısım değildir.
Bununla birlikte, yukarıdakiler göz önüne alındığında, umarım kaynak çekişmesi, endeksleme eksikliği, kötü yazılmış kodlar vb. Performansta şaşırtıcı farklılıklar yaratabilir.
Varsayımlar
Son bir şey. Bir veritabanı çağrısının, uygulamadan API'ya yapılan bir ağ çağrısına kıyasla ucuz olması gerektiğini belirttiniz. Ancak, uygulamanın ve API sunucularının aynı LAN'da olduğunu da belirttiniz. Bu nedenle, her ikisi de ağ aramalarıyla karşılaştırılamaz mı? Başka bir deyişle, her ikisi de aynı bant genişliğine sahip olduklarında neden API aktarımının veritabanı aktarımından daha yavaş büyüklük sırası olduğunu varsayıyorsunuz? Tabii ki protokoller ve veri yapıları farklı, bunu anlıyorum, ancak bunların farklı büyüklük sıraları olduğu varsayımına itiraz ediyorum.
Murkey nereden geliyor
Bütün soru "çoklu" ve "tek" veritabanı çağrıları ile ilgilidir. Ancak kaç tanesinin çoklu olduğu belli değil. Yukarıda söylediğimden dolayı, genel bir kural olarak, gerektiği kadar az veritabanı çağrısı yapmanızı öneririm. Ancak bu sadece temel bir kuraldır.
İşte nedeni:
- Veritabanları veri okumada mükemmeldir. Bunlar depolama motorlarıdır. Ancak, iş mantığınız başvurunuzda yaşar. Her API çağrısının tam olarak bir veritabanı çağrısıyla sonuçlandığına dair bir kural belirlerseniz, iş mantığınız veritabanında bulunabilir. Belki de sorun değil. Birçok sistem bunu yapıyor. Ama bazıları bilmiyor. Bu esneklikle ilgilidir.
- Bazen iyi bir ayırma elde etmek için, 2 veritabanı çağrısının ayrılmasını istersiniz. Örneğin, her HTTP isteği, kullanıcının DB'den doğru erişim haklarına sahip olduğunu doğrulayan genel bir güvenlik filtresi aracılığıyla yönlendirilir. Varsa, söz konusu URL için uygun işlevi yürütmeye devam edin. Bu işlev veritabanı ile etkileşime girebilir.
- Veritabanını bir döngüde çağırmak. Bu yüzden kaç tanesinin çoklu olduğunu sordum. Yukarıdaki örnekte, 2 veritabanı çağrınız olur. 2 iyidir. 3 iyi olabilir. N iyi değil. Veritabanını bir döngüde çağırırsanız, şimdi performans doğrusal hale getirmiş olursunuz, yani döngü girdisinde daha fazla zaman alır. Kategorik olarak, API ağ zamanının en yavaş olduğunu söyleyerek, veritabanınızın 10.000 kez çağıran henüz keşfedilmemiş bir döngü nedeniyle uzun süre alan trafiğinizin% 1'i gibi anomalileri tamamen göz ardı eder.
- Bazen, bazı karmaşık hesaplamalar gibi uygulamanızın daha iyi olduğu şeyler vardır. Veritabanından bazı verileri okumalı, bazı hesaplamalar yapmalı, sonra sonuçlara dayanarak, ikinci bir veritabanı çağrısına bir parametre iletmeniz gerekebilir (belki bazı sonuçlar yazmak için). Bunları yalnızca bir kez veritabanını çağırmak için tek bir çağrıda (saklı yordam gibi) birleştirirseniz, veritabanını uygulama sunucusunun daha iyi olabileceği bir şey için kullanmaya zorladınız.
- Yük dengeleme: 1 veritabanınız (muhtemelen) ve birden fazla yük dengeli uygulama sunucunuz var. Bu nedenle, uygulama ne kadar çok iş yapar ve veritabanı o kadar az çalışırsa ölçeklendirmek o kadar kolay olur çünkü bir uygulama sunucusu eklemek genellikle veritabanı çoğaltmasını kurmaktan daha kolaydır. Önceki madde işaretine bağlı olarak, bir SQL sorgusu çalıştırmak mantıklı olabilir, daha sonra uygulamadaki tüm hesaplamaları yapın, bu da birden fazla sunucuya dağıtılır ve ardından bitirildiğinde sonuçları yazar. Bu daha iyi verim sağlayabilir (toplam işlem süresi aynı olsa bile).
TL; DR
TLDR: LAN üzerinden bir ağ çağrısı yaparken birden fazla veritabanı çağrısı hakkında endişelenmek gerçekten önemli mi? Öyleyse neden?
Evet, ama sadece bir dereceye kadar. Pratik olduğunda veritabanı çağrılarının sayısını en aza indirmeye çalışmalısınız, ancak birbirleriyle hiçbir ilgisi olmayan çağrıları birleştirmek için birleştirmeyin. Ayrıca, veritabanını her ne pahasına olursa olsun bir döngüde çağırmaktan kaçının.