Günde 100M satır düz MySQL'de patlar: B-tree indeks ve tam tablo agregasyonu RAM'e sığmaz. SQL'de düşünüyor ve agregasyon istiyorsan TimescaleDB (hypertable + continuous aggregate + sıkıştırma) düşük sürtünmeli kazanç. InfluxDB yalnızca ayrı bir metrik stack istiyorsan.
#veritabanı#postgresql#ölçekleme
Skorları düz String'de tutup uygulamada sıralama — bu milyonlarca anahtar üzerinde okuma başına O(N log N). Sorted Set (ZSET) kullan: `ZADD` O(log N) güncelleme, `ZREVRANGE 0 99` zaten sıralı ilk 100, `ZREVRANK` O(log N) sıra. Yazarken sıralı tutar, okuma neredeyse sabit.
#veritabanı#redis#performans
Önce en ucuz sürümü dene: read-replica ekle, raporlamayı oraya taşı — kilitlenme çoğu zaman bununla biter. Tam CQRS'i yalnızca sorgu şekilleri tek şemaya sığmayacak kadar ayrıştığında kur; modelleri outbox pattern'le event-driven senkronla, dual-write yapma, eventual consistency'yi kabul et.
#veritabanı#mimari#elasticsearch
Para için invariant'ı DB'de tut. Atomik koşullu `UPDATE ... SET balance = balance - 40 WHERE id = ? AND balance >= 40` ya da `SELECT ... FOR UPDATE` kullan. Redlock yalnızca tek bir DB satırı olmayan kaynaklar için; bakiyeyi DB zaten koruyabiliyorken dağıtık kilide güvenme.
#veritabanı#kuyruk#redis
Sırf nitelikler değişkenler diye MongoDB'ye koşma — bu NoSQL tuzağıdır. İlişkisel çekirdeği (ürün, fiyat, sipariş) PostgreSQL'de tut, değişken nitelikleri GIN index'li bir `JSONB` kolonuna koy. Raporlama ihtiyacın tek başına Mongo'ya bölmeye karşı argüman.
#veritabanı#mimari#postgresql
Retry'ı sınırla: `tries`/`maxExceptions` + `backoff` ver, son hatada işi yeniden kuyruğa atma, `failed_jobs`'a düşür — Laravel'in yerleşik DLQ'su odur. Üstüne alert kur, `queue:retry` ile replay et. Asla sınırsız retry yapma.
#veritabanı#kuyruk#laravel
Liveness 'süreç takıldı mı?' sorusudur — ucuz ve bağımlılıksız tut (DB'yi burada kontrol etme). Readiness 'şu an istek alabilir miyim?' sorusudur — kritik bağımlılıkları kontrol et ama sonucu birkaç saniye cache'le. Liveness fail → restart, readiness fail → trafiği kes. Probe'lar DB'yi DDoS'lamasın.
#dayanıklılık#altyapı#kubernetes
`created_at`'e göre aylık RANGE declarative partitioning kullan. Sıfır kesinti için yeni parçalı tabloyu kur, geçmişi batch'ler hâlinde backfill et, uygulama yazmaya devam ederken isimleri tek transaction'da takasla. UNIQUE/PK ve FK'ler partition anahtarını içermek zorunda.
#veritabanı#postgresql#ölçekleme
Deadlock bir kilit-sıralama döngüsüdür. Kilitleri her zaman aynı global sırada al (örn. artan PK), transaction'ları kısa ve dar tut, en az satıra hedefli `FOR UPDATE` uygula. Yine de olacağını bekle: DB bir kurbanı abort eder, sen idempotent yapıp backoff ile retry et.
#dayanıklılık#veritabanı#postgresql
Her isteği `defer recover()` ile saran, stack'i + request id'yi loglayan, generic 500 dönen ve metrik basan bir middleware'i zincirin en dışına koy. Ama recover yalnızca aynı goroutine'i yakalar: handler içinde `go func()` açıyorsan o goroutine'in kendi recover'ı olmalı.
#dayanıklılık#go