Polling Problemi
Geliştiriciler gerçek zamanlı bir özellik oluşturduğunda—örneğin bir sohbet sistemi, canlı bildirimler veya canlı sipariş takipçisi—genellikle en kolay çözüme yönelirler: HTTP Polling. Flutter uygulamalarında her 5 saniyede bir Laravel API’sine ping atan bir zamanlayıcı yazarlar: “Yeni mesaj var mı? Hayır. Yeni mesaj var mı? Hayır.”
Bu, bir mobil uygulama için felaket bir mimari karardır. Polling, kullanıcının bataryasını tüketir, büyük miktarda mobil veri kullanır ve sunucunuza binlerce gereksiz istek gönderir. Eğer 1,000 aktif kullanıcınız her 5 saniyede bir polling yapıyorsa, sunucunuz “değişiklik yok” demek için dakikada 12,000 istek ile başa çıkmak zorundadır.
Olay Tabanlı Değişim
Gerçek bir gerçek zamanlı uygulama oluşturmak için geleneksel İstek-Cevap döngüsünü terk etmeli ve Olay Tabanlı Mimariyi benimsemelisiniz. WebSockets kullanarak.
WebSockets ile Flutter uygulaması, sunucuya bir kez bağlanır ve bağlantıyı açık tutar. Uygulama asla veri talep etmez. Bunun yerine, sadece dinler. Sunucuda bir olay gerçekleştiğinde, sunucu verileri anında istemciye iletir.
Laravel Reverb & Flutter ile Mimarileştirme
Geçmişte, WebSockets kurmak altyapı yönetimi açısından bir kabus idi ve Pusher gibi dışarıdan ücretli hizmetlere ihtiyaç duyuluyordu. Bugün, bunu Laravel Reverb (veya standart Laravel WebSockets) kullanarak dahili olarak yapılandırıyoruz.
Laravel’de, mantığı Event sınıfına izole ediyoruz ve bu sınıf ShouldBroadcast arayüzünü uyguluyor:
class OrderStatusUpdated implements ShouldBroadcast
{
public $order;
public function __construct(Order $order)
{
$this->order = $order;
}
// Sadece belirli kullanıcının özel kanalına yayın yap
public function broadcastOn()
{
return new PrivateChannel('user.' . $this->order->user_id);
}
}
Sipariş durumu değiştiğinde, olayı yayımlıyoruz. Laravel arka planda bunu WebSocket sunucusu üzerinden anında iletir.
Flutter tarafında ise, o özel kanala dinlemek için Laravel Echo kullanıyoruz. UI anında tepki verir, hiçbir polling gerekmez:
echo.private('user.${userId}')
.listen('OrderStatusUpdated', (event) {
// Anında Riverpod durumunu güncelle ve UI animasyonunu tetikle
ref.read(orderProvider.notifier).updateStatus(event['order']);
});
Sonuç
WebSockets artık yalnızca sohbet uygulamaları için değildir. Olay tabanlı bir mimariye geçerek, sunucu yükünü önemli ölçüde azaltırken mobil kullanıcılarınız için büyülü ve son derece duyarlı bir deneyim sunmuş olursunuz. Sunucudan güncellemeler istemeyi bırakın; sunucu ne zaman hazırsa size bildirsin.
Kaynak: Orijinal Makale


