Veritabanı Darboğazı
<p>Yüksek büyüme potansiyeline sahip SaaS platformları geliştirirken, web uygulamanızın kaçınılmaz olarak bir noktada veritabanı ana darboğaz haline gelecektir. Çoğu geleneksel mimari, kullanıcı kayıtları, ağır analiz sorguları ve arka plan işleme işlemlerinin tümünü tek bir ilişkisel veritabanı örneğine yönlendirir.</p>
<p>Buradaki mimari zayıflık şu şekildedir: İç pazarlama ekibinizin kontrol paneli tarafından oluşturulan karmaşık bir `SELECT` sorgusu, geniş bir CPU ve bellek kaynağı tüketebilir ve potansiyel olarak satırları kilitler. Eğer bir müşteri o anda kritik bir ödeme `INSERT` işlemi yapmaya çalışırsa, işlem ağır okuma işleminin arkasında beklemede kalacaktır. API zaman aşımına uğrar ve gelir kaybı yaşanır. Bu durumu aşmak için <strong>Veritabanı Okuma/Yazma Ayrımı</strong> uygulamanız gerekmektedir.</p>
<h2>Çözüm: Kopya Yönlendirme</h2>
<p>Modern veritabanı küme sistemleri, ölçeklendirmeyi bir Ana Düğüm (yazma için) ve birden fazla Okuma Replikası (okuma için) kullanarak gerçekleştirir. Replikalar sürekli olarak verileri birincil düğümden senkronize eder. Uygulamanızın trafiğini ayırarak, ağır analitik okumaların kritik işlem yazmalarını engellemeyeceğinizden emin olursunuz.</p>
<p>Laravel, bu mimari için yerel ve şık destek sunarak, minimum yapısal kod değişikliği gerektirir.</p>
<h3>Adım 1: Bağlantı Dizilerini Şemalandırma</h3>
<p>Öncelikle veritabanı yapılandırmamızı değiştirmemiz gerekiyor. Tek bir ana makine sağlamak yerine, okuma uç noktalarında bir dizi tanımlayıp, özel bir yazma uç noktası belirliyoruz. Laravel'in sorgu oluşturucu, artık tüm `SELECT` ifadelerini replikalara ve tüm `INSERT`, `UPDATE` ve `DELETE` ifadelerini ana düğüme otomatik olarak yönlendirecektir.</p>
<pre><code>// config/database.php
‘mysql’ => [
‘driver’ => ‘mysql’,
// ✅ ŞİRKET YAPISI: Bağlantı Ayrımı
'read' => [
'host' => [
'192.168.1.10', // Replika 1
'192.168.1.11', // Replika 2
],
],
'write' => [
'host' => [
'192.168.1.5', // Ana Düğüm
],
],
'sticky' => true, // Replicasyon gecikmesi koruması için kritik
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',],
<h3>Adım 2: Replika Gecikmesini Yönetme</h3>
<p>Okuma/yazma ayrımında gizli bir tehlike bulunmaktadır: <strong>Replika Gecikmesi</strong>. Verilerin ana düğüme yazılmasının replikalara ulaşması birkaç milisaniye alır. Bir kullanıcı profilini güncellerse ve hemen ardından kontrol paneline yönlendirilirse, kontrol paneli güncellemeyi almamış bir replikadan sorgu yapabilir ve eski verileri gösterebilir.</p>
<p>Laravel, yukarıda eklediğimiz <code>'sticky' => true</code> yapılandırmasıyla bu durumu zarif bir şekilde çözer. Bu özellik etkin olduğunda, eğer bir yazma işlemi geçerli istek yaşam döngüsü sırasında gerçekleşirse, Laravel otomatik olarak tüm sonraki okuma işlemlerini <em>yazma bağlantısına</em> yönlendirir ve anında tutarlılık sağlar.</p>
<p>Asenkron senaryolar (arka plan işinden sonra bir kullanıcı yönlendirmesi gibi) için de sorgunun yazma düğümüne zorla gitmesini sağlayabilirsiniz:</p>
<pre><code>namespace App\Http\Controllers;
use App\Models\User;
use Illuminate\Http\Request;
class UserController extends Controller
{
public function showProfile(Request $request, $id)
{
// 🚨 Standart okuma: Replika ile etkileşim (milisaniyelerce geride olabilir)
// $user = User::findOrFail($id);
// ✅ Kritik okuma: Sorguyu Ana Düğümde zorlayarak kesin doğruluk sağlama
$user = User::onWriteConnection()->findOrFail($id);
return response()->json($user);
}}
<h2>Mühendislik ROI'si</h2>
<p>Altyapı katmanında okuma/yazma ayrımını artırarak uygulamanızın verimliliğini anında artırabilirsiniz. Raporlama araçları ve kullanıcı panelleri, dağıtılmış replikalar arasında büyük toplama işlemleri gerçekleştirebilir ve bunun yanı sıra temel işlem faturalama ve kimlik doğrulama akışlarınızın sürekliliğini ve gecikmesini tehlikeye atmaz.</p>Kaynak: Orijinal Makale


