Yükleniyor...

Vercel Veritabanı Mimarisi: Modern Uygulama Tasarımı Rehberi

Yazar: Burak Balkı | Kategori: Database | Okuma Süresi: 10 dk

Vercel'in sunucusuz veritabanı ekosistemini (Postgres, KV, Blob, Edge Config) derinlemesine inceleyen, mimari tasarım desenleri ve kod örnekleri içeren tekni...

## Vercel Veritabanı Ekosistemi ve Mimari Temeller **Vercel**, modern web geliştirme süreçlerini basitleştiren bir platformdan, tam kapsamlı bir altyapı sağlayıcısına dönüşmüştür. Bu dönüşümün en kritik ayağını, sunucusuz (serverless) mimari ile tam uyumlu çalışan veritabanı çözümleri oluşturur. Geleneksel veritabanı yönetimi, sunucu provizyonu, bağlantı havuzu (connection pooling) yönetimi ve ölçeklendirme gibi karmaşık süreçler gerektirirken, Vercel bu süreçleri soyutlayarak geliştiricilere doğrudan veri modelleme ve uygulama mantığına odaklanma imkanı tanır. Vercel'in veri katmanı mimarisi üç temel sütun üzerine inşa edilmiştir: 1. **Vercel Postgres**: İlişkisel veri yönetimi (SQL). 2. **Vercel KV**: Düşük gecikmeli anahtar-değer depolama (Redis tabanlı). 3. **Vercel Blob**: Nesne depolama (S3 alternatifi). 4. **Vercel Edge Config**: Global, ultra düşük gecikmeli konfigürasyon verisi. Bu rehberde, bu bileşenlerin mimari tasarımda nasıl konumlandırılacağını ve kurumsal düzeyde bir sistemin nasıl inşa edileceğini inceleyeceğiz. ## Vercel Postgres: Sunucusuz İlişkisel Veritabanı Tasarımı **Vercel Postgres**, Neon tarafından desteklenen, tam olarak yönetilen ve sunucusuz bir PostgreSQL çözümüdür. Bu mimarinin en büyük avantajı, boşta duran kaynaklar için ödeme yapmamanız ve trafik arttığında otomatik olarak ölçeklenmesidir. ### Mimari Bağlantı ve Pool Yönetimi Serverless fonksiyonlar, doğası gereği kısa ömürlüdür. Geleneksel PostgreSQL bağlantıları her fonksiyon tetiklendiğinde yeni bir TCP bağlantısı açmaya çalışırsa, veritabanı bağlantı limitlerine (max connections) hızla ulaşılır. Vercel Postgres, bu sorunu **HTTP-based querying** ve yerleşik bağlantı havuzu ile çözer. ```sql -- Örnek Tablo Tasarımı CREATE TABLE users ( id SERIAL PRIMARY KEY, email VARCHAR(255) UNIQUE NOT NULL, full_name TEXT, created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE posts ( id SERIAL PRIMARY KEY, author_id INTEGER REFERENCES users(id), title TEXT NOT NULL, content TEXT, published BOOLEAN DEFAULT FALSE ); ``` Uygulama tarafında `@vercel/postgres` SDK'sı kullanarak veri çekme işlemi şu şekilde gerçekleştirilir: ```typescript import { sql } from '@vercel/postgres'; export default async function handler(request, response) { try { const result = await sql`SELECT * FROM users WHERE email = ${request.query.email}`; return response.status(200).json({ users: result.rows }); } catch (error) { return response.status(500).json({ error }); } } ``` ## Vercel KV: Düşük Gecikmeli Redis Entegrasyonu **Vercel KV**, Upstash tarafından desteklenen, dayanıklı ve düşük gecikmeli bir anahtar-değer deposudur. Oturum yönetimi, hız sınırlama (rate limiting) ve geçici veri depolama için idealdir. ### Hız Sınırlama Mimarisi Bir API'yi kötüye kullanıma karşı korumak için Edge Middleware üzerinde Vercel KV kullanımı yaygın bir mimari desendir. ```typescript import { kv } from '@vercel/kv'; import { NextRequest, NextResponse } from 'next/server'; export async function middleware(req: NextRequest) { const ip = req.ip ?? '127.0.0.1'; const limit = 100; // 100 istek const duration = 60 * 60; // 1 saat const currentRequests = await kv.incr(`rate_limit:${ip}`); if (currentRequests === 1) { await kv.expire(`rate_limit:${ip}`, duration); } if (currentRequests > limit) { return new NextResponse('Too Many Requests', { status: 429 }); } return NextResponse.next(); } ``` ## Vercel Blob: Nesne Depolama ve Veri Yönetimi **Vercel Blob**, dosyaları, görselleri ve büyük veri bloklarını saklamak için optimize edilmiştir. Cloudfront gibi bir CDN ile entegre çalışarak veriyi global olarak dağıtır. ### İstemci Tarafından Yükleme Mimarisi Sunucu yükünü azaltmak için dosyaları doğrudan istemciden Vercel Blob'a yüklemek, ancak güvenliği sunucu tarafında imzalanmış bir token ile sağlamak en iyi pratiktir. ```typescript import { put } from '@vercel/blob'; // Server Action veya API Route export async function uploadAvatar(formData: FormData) { const imageFile = formData.get('image') as File; const blob = await put(imageFile.name, imageFile, { access: 'public', }); // Veritabanına URL'i kaydet await sql`UPDATE users SET avatar_url = ${blob.url} WHERE id = 1`; return blob; } ``` ## Vercel Edge Config: Global Yapılandırma ve Hız **Edge Config**, veriyi ağın uç noktalarında (edge) saklayan bir salt-okunur anahtar-değer deposudur. Okuma işlemleri 0ms ile 1ms arasında gerçekleşir çünkü veri fonksiyonun çalıştığı veri merkezinde zaten mevcuttur. ### Feature Flag Yönetimi Bir özelliğin anında açılıp kapatılması gereken senaryolarda Edge Config rakipsizdir. ```typescript import { get } from '@vercel/edge-config'; export async function middleware() { const isMaintenanceMode = await get('maintenance_mode'); if (isMaintenanceMode) { return Response.redirect(new URL('/maintenance', request.url)); } } ``` ## Mimari Tasarım Desenleri: Serverless ve Database Entegrasyonu Sunucusuz mimarilerde veritabanı tasarımı yapırken **Statelessness** (durumsuzluk) ilkesi esastır. Veritabanı bağlantıları fonksiyonlar arasında paylaşılmaz, bu nedenle her fonksiyonun kendi bağlantı yaşam döngüsünü yönetmesi gerekir. | Özellik | Vercel Postgres | Vercel KV | Edge Config | | :--- | :--- | :--- | :--- | | Veri Tipi | İlişkisel (SQL) | Key-Value | JSON | | Gecikme | Orta (10-50ms) | Düşük (5-20ms) | Ultra Düşük (1ms) | | Ölçeklenme | Otomatik | Otomatik | Global Replikasyon | | Kullanım Durumu | Kullanıcı Verileri, Siparişler | Session, Rate Limit | Feature Flags, Redirects | ## Veri Güvenliği ve Erişim Kontrolü (IAM) Vercel ekosisteminde güvenlik, ortam değişkenleri (Environment Variables) ve role-tabanlı erişim kontrolü (RBAC) ile sağlanır. Veritabanı bağlantı dizgileri asla kod içerisinde saklanmamalıdır. ```bash # .env.local örneği POSTGRES_URL="postgres://default:password@ep-cool-darkness-123.us-east-1.aws.neon.tech/verceldb" KV_URL="redis://default:password@root-unique-123.upstash.io:30000" BLOB_READ_WRITE_TOKEN="vercel_blob_rw_..." ``` ## Performans Optimizasyonu ve Edge Caching Stratejileri Veritabanı sorgularını optimize etmek için **Stale-While-Revalidate (SWR)** deseni kullanılmalıdır. Vercel'in Data Cache mekanizması, veritabanı sonuçlarını CDN üzerinde önbelleğe alarak veritabanı yükünü minimize eder. ```typescript // Next.js 14+ Data Fetching async function getLatestPosts() { const res = await fetch('https://api.example.com/posts', { next: { revalidate: 3600 } // 1 saat önbellekle }); return res.json(); } ``` ## Hata Yönetimi ve Dayanıklılık (Resilience) Sunucusuz fonksiyonlarda veritabanı hataları genellikle ağ zaman aşımları veya bağlantı limitlerinden kaynaklanır. Bu durumlarda **Exponential Backoff** (üstel geri çekilme) stratejisi uygulanmalıdır. ```typescript import { sql } from '@vercel/postgres'; async function queryWithRetry(query, params, retries = 3) { for (let i = 0; i < retries; i++) { try { return await sql(query, params); } catch (err) { if (i === retries - 1) throw err; await new Promise(res => setTimeout(res, Math.pow(2, i) * 100)); } } } ``` ## Sık Yapılan Mimari Hatalar ve Çözümleri 1. **Ağır Sorguların Edge'de Çalıştırılması**: Edge Runtime, CPU limitlerine sahiptir. Karmaşık JOIN işlemlerini Node.js Runtime üzerinde çalıştırın. 2. **Bağlantı Kapatmayı Unutmak**: SDK'lar genellikle bunu otomatik yapar ancak manuel sürücülerde `client.end()` unutulmamalıdır. 3. **Veri Replikasyon Gecikmesi**: KV veritabanında yazma işlemi yapıldıktan hemen sonra okuma yapıldığında verinin henüz yayılmamış olma ihtimali (Eventual Consistency) göz önünde bulundurulmalıdır. ## Sık Sorulan Sorular (FAQ) **1. Vercel Postgres üretim ortamı için hazır mı?** Evet, Neon altyapısı üzerinde çalışan Vercel Postgres, yüksek erişilebilirlik ve otomatik yedekleme özellikleriyle kurumsal projeler için uygundur. **2. Soğuk başlatma (Cold Start) veritabanı performansını etkiler mi?** Vercel Postgres, HTTP tabanlı bağlantı kullandığı için geleneksel TCP tabanlı veritabanlarına göre soğuk başlatma etkisinden çok daha az etkilenir. **3. KV ve Edge Config arasındaki temel fark nedir?** KV yazılabilir ve okunabilir bir depoyken, Edge Config genellikle dashboard üzerinden güncellenen ve uç noktalarda sadece okunmak üzere optimize edilmiş statik veriler içindir. **4. Ücretsiz planda limitler nelerdir?** Ücretsiz planda depolama ve bant genişliği limitleri mevcuttur; ancak geliştirme ve küçük ölçekli projeler için oldukça cömerttir. **5. Mevcut bir PostgreSQL veritabanını Vercel'e nasıl taşırım?** `pg_dump` aracını kullanarak verinizi dışa aktarabilir ve Vercel Postgres CLI veya arayüzü üzerinden içe aktarabilirsiniz. ## Özet ve Sonuç Vercel'in veritabanı mimarisi, geliştirici deneyimini (DX) merkeze alarak altyapı karmaşıklığını ortadan kaldırır. **Vercel Postgres** ile ilişkisel verilerinizi yönetebilir, **Vercel KV** ile performans kritik işlemleri hızlandırabilir ve **Vercel Blob** ile medya dosyalarınızı ölçeklendirebilirsiniz. Bu bileşenleri doğru mimari desenlerle birleştirmek, modern, hızlı ve güvenilir uygulamalar inşa etmenin anahtarıdır.