B2B SaaS’de Veritabanı Darboğazı
<p>Smart Tech Devs'de kurumsal uygulamalar geliştirirken, veritabanı sorgularının maliyetli olduğunu biliyoruz. SaaS platformunuz ölçeklendikçe ve binlerce kullanıcı karmaşık panellere aynı anda erişim sağladıkça, PostgreSQL veya MySQL veritabanınıza tamamen güvenmek, sunucularınızı darboğaza sokacaktır. Mükemmel dizinleme ile bile, ağır tablolarda (finansal raporlar veya küresel analizler gibi) yüksek eşzamanlı okumalar CPU kullanımını artıracak ve API yanıt sürelerini düşürecektir.</p>
<p>Çözüm, saldırgan bir önbellek stratejisidir. Ancak, önbellekleme bilgisayar biliminde en zor problemlerden biridir; çünkü veriyi saklamak zor değil, ancak ne zaman sileceğinizi bilmek (Cache Invalidation) son derece karmaşıktır.</p>
<h2>Basit Önbelleğin Ötesinde: Önbellek Etiketlerinin Gücü</h2>
<p>Önbellekleme için standart <code>Cache::remember()</code> kullanımı statik veriler için harika çalışır. Ancak, belirli bir kiracının fatura listesini önbelleğe aldığınızda ve o kiracı yeni bir fatura oluşturduğunda ne olur? Genel bir önbellek anahtarı kullandıysanız, kullanıcı yeni verilerini görene kadar Zaman Aşımı (TTL) süresinin dolmasını beklemek zorundasınız. Bu, modern bir B2B uygulamasında kabul edilemez bir kullanıcı deneyimidir.</p>
<p>Laravel'de Redis'i önbellek sürücüsü olarak kullanarak, <strong>Önbellek Etiketleri</strong> gücünü açığa çıkarıyoruz. Önbellek Etiketleri, önbelleğe alınan verimize birden fazla tanımlayıcı ile etiket verme imkanı tanır ve bir durum değişikliği gerçekleştiğinde yalnızca etkilenen verileri hassas bir şekilde temizlememizi sağlar.</p>
<h3>Aşama 1: Repositori'lerde Etiketli Önbellek Uygulaması</h3>
<p>Bir kiracının panel analizlerini nasıl aldığımızı ve önbelleğe aldığımızı inceleyelim. Önbelleği, hem genel bir <code>tenant_analytics</code> etiketi hem de belirli bir <code>tenant_id</code> etiketi ile etiketleyeceğiz.</p>
<pre><code>namespace App\Repositories;
use App\Models\Tenant;
use Illuminate\Support\Facades\Cache;
class AnalyticsRepository
{
/
Karmaşık panel istatistiklerini al, yoğun bir şekilde önbellekli.
*/
public function getDashboardStats(Tenant $tenant)
{
// Bu özel sorgu için benzersiz bir anahtar tanımlayın
$cacheKey = “dashboardstats{$tenant->id}”;// Cache::tags() kullanarak bu önbellek öğesini kategorize edin
return Cache::tags([‘analytics’, “tenant_{$tenant->id}”])->remember($cacheKey, now()->addHours(24), function () use ($tenant) {
// Maliyetli, çoklu tablo sorgusu toplaması simüle edin
return [
‘total_revenue’ => $tenant->invoices()->sum(‘amount’),
‘active_users’ => $tenant->users()->where(‘status’, ‘active’)->count(),
‘recent_activity’ => $tenant->activityLogs()->latest()->take(10)->get(),
];
});
}
}
<h3>Aşama 2: Eloquent Gözlemcileri ile Şık Önbellek İptali</h3>
<p>Artık bir kiracı yeni bir fatura eklediğinde veya yeni bir kullanıcı katıldığında, panellerinin anında güncellenmesini sağlamak zorundayız. Kontrolcülerimizi <code>Cache::forget()</code> çağrıları ile kirletmek yerine, model olaylarını dinlemek ve etiketleri otomatik olarak iptal etmek için Laravel Eloquent Gözlemcilerini kullanıyoruz.</p>
<pre><code>namespace App\Observers;
use App\Models\Invoice;
use Illuminate\Support\Facades\Cache;
class InvoiceObserver
{
/
- Fatura “oluşturuldu” olayını işleme.
*/
public function created(Invoice $invoice): void
{
// Sadece belirli bir kiracının analitik önbelleğini hassas şekilde temizleyin.
// Diğer kiracıların önbellekleri yerinde kalır!
Cache::tags([“tenant_{$invoice->tenant_id}”])->flush();
}
/
* Fatura "güncellendi" olayını işleme.
*/
public function updated(Invoice $invoice): void
{
Cache::tags(["tenant_{$invoice->tenant_id}"])->flush();
}
// ... silme, geri yükleme vb. işlemleri yönetin.}
<h2>Mimari Kazançlar</h2>
<p>Etiket tabanlı bir Redis önbellek mimarisine geçiş, hemen ölçeklenebilir faydalar sağlar:</p>
<ol>
<li>
<strong>Sıfır Eski Veri:</strong> Kullanıcılar, önbellek belleğinin hızı ile canlı veritabanı sorgularının doğruluğunu alır, çünkü iptal etme işlemi altında yatan veri değiştiği anda gerçekleşir.</li>
<li>
<strong>Hassas Kesme:</strong> Bir etiketi temizlemek, yalnızca etkilenen kiracı için önbelleği yok eder. Geleneksel bir önbellek temizleme, tüm sistemi temizleyeceği için, her kullanıcının önbelleğini tekrar doldurması sonucu veritabanınıza yoğun bir trafik akışı yaratır (Cache Stampede).</li>
<li>
<strong>Temiz Kontrolcüler:</strong> İptal etme mantığını Gözlemcilere iterek, iş mantığınızın ayrı ve temiz kalmasını sağlarsınız.</li>
</ol>
<h2>Sonuç</h2>
<p>Veritabanınızı korumak, B2B SaaS'ı ölçeklendirmenin anahtarıdır. Laravel'de Redis Önbellek Etiketlerini ve Eloquent Gözlemcilerini ustaca kullanarak, milisaniyeler içinde yüklenen paneller inşa edebilir, veri bütünlüğünü ve sistem dayanıklılığını büyük yük altında sağlayabilirsiniz.</p>Kaynak: Orijinal Makale


