MongoDB ve Mongoose ile Ölçeklenebilir Veritabanı Mimarisi Kurulumu Rehberi
Modern web projeleri ve dijital ajans iş yükleri için MongoDB ve Mongoose ile yüksek performanslı, ölçeklenebilir veritabanı mimarisi kurulum adımları.
Sistem Yöneticisi
Kıdemli Yazılım Mimarı
Modern Web ve NoSQL Veritabanı Trendleri
Modern web projelerinde veri hacmi hızla büyür. Dijital ajans ekipleri yüksek trafik alan uygulamalarda doğru mimariyi seçmelidir. Bu rehber, ölçeklenebilir MongoDB ve Mongoose altyapısı kurma adımlarını içerir.
Adım 1: Optimize Edilmiş Bağlantı Havuzu Yapılandırması
Tekil bağlantılar yüksek trafikte tıkanır. Bağlantı havuzu (connection pool) kullanılmalıdır.
const mongoose = require('mongoose');
const connectDB = async () => {
await mongoose.connect(process.env.MONGO_URI, {
maxPoolSize: 50,
minPoolSize: 10,
serverSelectionTimeoutMS: 5000,
socketTimeoutMS: 45000
});
};
module.exports = connectDB;Adım 2: Doğru Şema Tasarımı (Embedding vs Referencing)
Veri modelleme ölçeklenebilirliğin temelidir. İki ana yaklaşım bulunur:
- Embedding (Gömme): 1-1 veya sınırlı 1-N ilişkiler için uygundur. Tek sorguda okunur, I/O yükü düşer.
- Referencing (Referans Verme): Sürekli büyüyen 1-N veya N-N ilişkilerde kullanılır. 16MB doküman limitini engeller.
Adım 3: Bileşik ve TTL İndeks Stratejileri
Sorgu hızını belirleyen ana faktör doğru indekslemedir. Full collection scan engellenmelidir.
const userSchema = new mongoose.Schema({
email: { type: String, unique: true, index: true },
tenantId: { type: mongoose.Schema.Types.ObjectId, index: true },
createdAt: { type: Date, default: Date.now }
});
// Compound Index: Sık birlikte filtrelenen alanlar
userSchema.index({ tenantId: 1, createdAt: -1 });Adım 4: Lean Query Kullanımı ile Bellek Optimizasyonu
Mongoose dokümanları ağır ek methodlar taşır. Yalnızca okuma yapılan işlemlerde .lean() eklenerek JSON formatında hızlı veri çekilir. Bellek tüketimi %70 azalır.
const getUsers = async (tenantId) => {
return await UserModel.find({ tenantId }).select('email name').lean();
};Pratik İpucu: Büyük veri kümelerindeskip()yerine_idtabanlı cursor paginasyonu kullanın. Sayfa ilerledikçe sorgu yavaşlamasını engeller.