Bende haftalardır benzer bir arayış içindeyim. Projemde ilşkisel yapıyı bol bol kullanacağım için RDBMS öncelikli düşünüyorum. Bunun yanında @mgsmus'da dediği gibi NoSQL ve Redis gibi seçeneklerlede destek olmak lazım.
MySQL tarafında birçok çözüm ve motor var. Bazı motorlar write heavy
bazıları read heavy
için optimize edilmiş. Diğerleri de dengeli gitmeye çalışılmış. ER söz konusu olunca burada bol bol benchmark analiz etmek önemli. MySQL için araştırma yaparken sık sık percona server karşıma çıkıyor. Dengeli ve optimize bir çözüm olduklarını idda ediyorlar. Percona ayrıca Facebook'un MyRocks'ın depolama motoruna da içeriyor gibi görünüyor. Gayet iyi bir paket, bakmakta fayda var.
PostgreSQL aklımı çeldi bile. MySQL RDBMS ise PostgreSQL O-RDBMS mantığıyla çalışıyor. Yani daha karmaşık bir taleplere karşılık verebiliyor. Bu yanıyla MSSQL Server ve Oracle ile yarışır diye düşünüyorum. MySQL'e göre daha kapsamlı bir veritabanı. Tabiki bu avantajı veri miktarı büyükçe belli oluyor gibi görünüyor. Şurada farklı kıyaslamalar var; 1, 2, 3, 4.
Altyapı için Kubernetes, Docker, Mikro Mimari ve Open Source odaklı olmak istediğim için alternatifleri eledim. Elbette deneyime göre MSSQL Server, Oracle, DB2'da kullanılabilir ama hiç kullanmayan biri için öğrenme süreci bile ayrı bir maliyet bence.
Bununla beraber veriyi işleyip ileten organ backend dili de önemli bir detay. Eğer milyarlarca data söz konusu ise framework konusunu iki kere düşünmek gerekiyor. Laravel milyonluk veritabanlarıda bile bariz bir şekilde yavaş tepki verebiliyor. Elbette ortam da önemli ama kaynaklar kısıtlı ise Lumen + SPA şeklinde tavsiye ediyorum.
Eğer veri ciddi anlamda karmaşık bir şey ise buna bir de REST API yazmak lazım ki bu da başka bir maliyet kalemi. Üstelik dökümante etmeside zor. Bu yüzden GraphQL kullanmayı düşünüyorum. Lumen + GraphQL kötü bir tercih olmasa da performans kaybına neden olabilir. Bu yüzden daha az kayıp için low level dillere sardım. Muhtemelen backend için Go + GraphQL tercih edeceğim.
PostgreSQL'de 200K data bulunan users
tablosuna aşağıdaki sorguyu yapıyorum,
SELECT
COUNT(id) AS count_id,
email,
created_at,
COUNT(updated_at) AS count_updated_at,
COUNT(full_name) AS count_full_name
FROM users
GROUP BY id
LIMIT 100
Response Times
- Laravel + Raw Query: ~ 600-700ms
- Lumen + Raw Query: ~ 40-70ms
- Node + NestJS + Raw Query: ~ 3-20ms
- Golang + GraphQL: ~ 3-7ms
Ekleme: yukarıdaki sonuçları Docker ile AMD Ryzen 9 5900X ve 32 GB bellekli bir sistem üzerinde alıyorum.
Laravel ve Lumen'deki dar boğaz en az LIMIT
10-20K'ya kadar sürüyor. Node + NestJS ile ilk cevaplar için gecikme çok yüksek ama sonraki isteklerde çok düşüyor, sonra bellek şişiyor. Elbette bu ideal bir senaryo değil ama muhasebe hesapları yapılmaya başlandıkça yukarıdaki değerler bir şekilde yine elde edilmeye başlanılacak bence. Henüz finalde hangi seçenekeri kullanacağım bilmiyorum ama büyük projelerin uzun ömürlü, tepkisel, esnek ve genişletilebilir olmasına özen gösterilmeli. Bendeki inciler bu kadar 😊.