Blog
Mert Özen'in yazılım geliştirme, backend, frontend ve DevOps üzerine blog yazıları.
Nginx ile ASP.NET Core Reverse Proxy: proxy_pass, Header'lar, WebSocket/SignalR ve Timeout'lar
Nginx 1.29.7'den beri upstream keepalive ve HTTP/1.1 varsayılan, ama yalnız upstream block'u kullanırsan: doğrudan adrese giden proxy_pass her istekte yeni bağlantı açıyor. Microsoft'un referans config'ini satır satır açıyor, WebSocket upgrade map'i olmadan SignalR'ın sessizce long polling'e düştüğünü, SSE'de buffering'i, Nginx ile Kestrel'in body ve header limit'lerini hizalamayı ve 502 ile 504'ü log'dan ayırt etmeyi ölçüyoruz.
.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.
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.
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'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 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.
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.
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.