Blog
Mert Özen'in yazılım geliştirme, backend, frontend ve DevOps üzerine blog yazıları.
Real-time Seçenekleri: Polling, Long Polling, Server-Sent Events, WebSocket ve SignalR — Hangisi Ne Zaman?
Tek yönlü bildirim için SSE, çift yönlü düşük gecikme için WebSocket ya da SignalR, nadiren değişen veri için polling yeterli. Aynı sipariş durumunu beş teknikle yapıp gecikmeyi, istek sayısını ve bağlantı başına belleği ölçüyoruz; karar tablosu, WebTransport'un durumu ve neden her şeyi real-time yapmamak gerektiği.
ASP.NET Core'da Çıplak WebSocket: UseWebSockets, Receive Döngüsü, Close Handshake ve Angular Client
Çıplak WebSocket'te mesajı EndOfMessage gelene kadar biriktirip boyutla sınırlaman, socket'e tek bir döngüden yazman ve Origin'i kendin kontrol etmen gerekir. Receive döngüsü, close handshake, KeepAliveTimeout, Channel ile gönderim kuyruğu, connection registry, compression riski ve Angular'da RxJS webSocket() ile backoff'lu yeniden bağlanma.
Server-Sent Events Derinlemesine: TypedResults.ServerSentEvents, Last-Event-ID ile Kaldığı Yerden Devam ve Proxy Tuzakları
SSE'de kaçırılan event'leri telafi etmek için her event'e EventId ver, Last-Event-ID header'ından sonrasını yeniden gönder ve bağlanır bağlanmaz bir heartbeat yolla. SseItem<T>, retry, CancellationToken, Nginx gzip ve timeout tuzakları, HTTP/1.1'in 6 bağlantı limiti, Angular'da EventSource'u Observable'a sarmak ve header gerektiğinde fetch ile okumak.
ASP.NET Core SignalR'a Giriş: Hub, Strongly Typed Hub ve Angular'dan @microsoft/signalr ile Bağlanmak
SignalR hub'ı her çağrıda yeniden oluşturulan, transient bir handler'dır; state tutmaz, istemciye gösterilecek hatayı HubException ile verir. AddSignalR ve MapHub, Hub<IClient> ile tip güvenli çağrılar, transport negotiation, Angular'da HubConnection'ı signal yayınlayan bir service'e kapsüllemek ve AllowCredentials ile açık origin listesi.
SignalR'da Kullanıcılar, Gruplar ve Connection Yaşam Döngüsü: IHubContext ile Sunucunun Her Yerinden Mesaj Göndermek
Clients.User bir kullanıcının bütün sekmelerine gider, grup üyeliği ise bağlantıya aittir ve yeniden bağlanmada kaybolur. IUserIdProvider, Caller/Others/OthersInGroup, OnConnectedAsync ile OnDisconnectedAsync'in beklenmedik sırası, Redis'te sayaçla presence ve IHubContext ile endpoint'ten, BackgroundService'ten ve consumer'dan bildirim göndermek.
SignalR'da Authentication, Authorization ve Güvenlik: JWT, access_token Query String ve Hub Method Policy'leri
SignalR'da kullanıcı bağlanırken bir kez doğrulanır; token süresi dolsa da rol değişse de bağlantı varsayılan olarak açık kalır. OnMessageReceived ile access_token, token'ın log'lara düşmesi, accessTokenFactory, hub ve method policy'leri, HubInvocationContext ile resource-based kontrol, IHubFilter ile rate limiting, mesaj boyutu, Origin ve CloseOnAuthenticationExpiration.
SignalR'da Dayanıklılık: Automatic Reconnect, Stateful Reconnect, Streaming ve MessagePack
Stateful reconnect yalnızca anında toparlanan kısa kopuşlarda mesaj kaybını önler; saniyeler süren kesintide yeni bağlantı ve kayıp mesaj var. Jitter'lı retry policy, onreconnected'da grupları yeniden kurmak, IAsyncEnumerable ile server ve client streaming, iptal, MessagePack'in byte kazancı ile PascalCase ve tarih tuzağı, yavaş istemci limitleri.
SignalR'ı Scale-Out Etmek ve Production'da İşletmek: Sticky Session, Redis Backplane, Azure SignalR Service ve İzleme
Birden fazla sunucuda SignalR için iki şey gerekir: negotiate ile bağlantıyı aynı sunucuya götüren sticky session ve mesajları sunucular arasında taşıyan bir backplane. Nginx ile gerçek hata mesajları, skipNegotiation istisnası, Redis backplane ve kanal prefix'i, Redis kesintisinde kaybolan mesajlar, Azure SignalR Service ve SignalR metric'leri ile tracing.
.NET 8'den .NET 11'e Real-time'da Gelenler: Stateful Reconnect, Native AOT, SSE ve SignalR Authentication Refresh
.NET 8 stateful reconnect'i, .NET 9 polymorphic hub parametrelerini, ActivitySource'u ve SignalR için Native AOT'yi, .NET 10 TypedResults.ServerSentEvents'i getirdi; .NET 11 ise bağlantıyı koparmadan token yenileyen authentication refresh'i ekliyor. AOT'de 28 MB'a karşı 82 MB ölçümü, strongly typed hub'ın AOT uyarısı, iptal edilebilir hub çağrıları, OpenAPI 3.2'de SSE ve eski ASP.NET SignalR.