Veritabanı Anket Felaketi
<p>Smart Tech Devs'te yüksek hızda metrik akış hatları tasarlarken, gerçek zamanlı olay akışı standart bir uygulamadır. Milyonlarca IoT cihazı veya kullanıcı oturumu her birkaç saniyede veri güncellemeleri gönderdiğinde, geliştiricilerin ilişkisel veritabanlarını (PostgreSQL veya MySQL gibi) bu gelen durum değişikliklerini sürekli olarak kontrol etmek için kullanması tehlikeli bir mimari hataya neden olur.</p>
<p>Arka planda çalışan işçilerin <code>SELECT * FROM events WHERE status="pending"</code> sorgusunu her 500 milisaniyede bir çalıştırmalarını zorlamak, muazzam bir okuma amplifikasyonu fırtınasına yol açar. Tablo satırları arttıkça, veritabanı disk I/O'nuz %100 kapasiteye ulaşır, işlem kilitleri birikir ve temel veri katmanınız tıkanır. Yüksek hacimli gerçek zamanlı güncellemeleri temiz bir şekilde işlemek için, ham mesajlaşmayı kalıcı depolama katmanından tamamen ayırmalısınız; bu işlem için ultra hızlı Redis Pub/Sub Worker Pool kullanmalısınız.</p>
<h2>Redis Publish/Subscribe Mekaniği</h2>
<p>Standart disk bağlı veritabanı kuyruklarının aksine, Redis Publish/Subscribe (Pub/Sub) modeli tamamen sistem belleğinde çalışır. Yayıncıların mesajları kimin alacağına bakmadan gönderebildiği, alıcıların ise tabloları sorgulamadan kanallara dinlediği hafif, sürtünmesiz bir mesajlaşma kanalı sağlar.</p>
<p>Etkin bir veri soketi bir yük gönderdiğinde, API'niz bu mesajı anında belirlenen bir Redis kanalı üzerinde yayınlar. Uzun süreli çalışan Laravel kuyruk işçileri bu bellek kanalına sürekli bağlı kalır. Bir mesaj düştüğünde, Redis doğrudan işçinin yürütme bellek ipine iletir. Temel ilişkisel veritabanı, veri tamamen derlenip güvenli bir toplu kalıcılık için hazır olana kadar asla dokunulmaz; böylece sorgu yükünüz sıfıra düşer.</p>
<h3>Adım 1: Olayları Anında Redis Üzerinden Yayınlama</h3>
<p>Yükleri hızlı yol HTTP API Kontrolcüsü içinde doğrudan bellek kanalına gönderiyoruz ve istemciye 5 milisaniye içinde 202 yanıtı dönüyoruz.</p>
<pre><code>namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Redis;
class DeviceTelemetryController extends Controller
{
public function ingest(Request $request)
{
$payload = $request->validate([
‘device_id’ => ‘required|string’,
‘metrics’ => ‘required|array’,
]);
// Zaman damgası meta verisini güvenli bir şekilde ekleyin
$payload['processed_at'] = microtime(true);
// ✅ KURUMSAL PATERNI: Belleğe doğrudan yayın yapın.
// Gerçek zamanlı çıktılar için disk kuyruk işlemlerini tamamen atlar.
Redis::publish('telemetry-stream', json_encode($payload));
return response()->json(['status' => 'acknowledged'], 202);
}}
<h3>Adım 2: Özel Uzun Süreli Dinleyici Oluşturma</h3>
<p>Kesintisiz olarak Redis kanal ipini dinleyen özel bir Artisan komutu oluşturuyoruz.</p>
<pre><code>namespace App\Console\Commands;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Redis;
use App\Models\TelemetrySnapshot;
class ConsumeTelemetryStream extends Command
{
protected $signature=”stream:consume-telemetry”;
protected $description = ‘Redis Pub/Sub bellek katmanından gelen olayları tüketin.’;
public function handle()
{
$this->info('Redis Pub/Sub borusuna bağlanılıyor...');
// Kanala abone ol. Bu döngü bellek içinde açık kalır.
Redis::subscribe(['telemetry-stream'], function (string $message) {
$data = json_decode($message, true);
// Ağır işleme matematiğini burada gerçekleştirin...
$computedMetrics = $this->analyzePayload($data['metrics']);
// Nihai hesaplanmış kesiti kalıcı depolama alanına güvenli bir şekilde yazın
TelemetrySnapshot::create([
'device_id' => $data['device_id'],
'data' => $computedMetrics
]);
});
}
private function analyzePayload(array $metrics): array
{
// Dahili veri temizleme mantığı
return array_filter($metrics, fn($val) => $val > 0);
}}
<h2>Mühendislik ROI</h2>
<p>Yüksek hızda bildirim akışlarını ilişkisel tablolardan çıkararak Redis Pub/Sub motoruna taşıdığınızda, ana veritabanınızı bağlantı tükenmesinden korumuş olursunuz. API uç noktalarınız, disk işlemlerinden ayrıldığında, zirve anlarında sorunsuz bir şekilde işlem yapar. Arka plan havuzunuz olayları anında bellek içinde işler ve trafiğiniz arttıkça gerçek zamanlı yürütme sınırları sağlar.</p>Kaynak: Orijinal Makale


