SignalR & WebSocket

Gizem Duru
3 min readAug 23, 2019

--

SignalR

Real-time based bir uygulama geliştirdiğinizi düşünün. Uygulamanızın içeriği bir chat uygulaması olabilir, ya da anlık olarak güncellenen haber sitesi yaptığınızı hayal edin. Sayfanızı refresh etmeden tüm güncellemelerden haberdar olmak istiyorsunuz. Her seferinde yeni bir mesaj gelmiş mi diye sayfayı yenilemek (sunucuya request göndermek) ya da yeni haberler var mı diye sayfayı yenilemek hem kullanıcı açısından yorucu bir işlem hem de sistemsel açıdan kaynak tüketimini arttıran bir davranış olacaktır. Her sayfa yenileme işleminizde sunucuya işlenmeyi bekleyen yeni requestler gönderiyor olacaksınız. Aynı sunucuya sizin gibi ulaşmayı çalışan n tane client olduğunu düşünürseniz sunucu üzerindeki yoğunluğu geç dönen response larınızdan anlayabilirsiniz. Üzerinde işlem görmeyi bekleyen, sıraya girmiş bir sürü request olan bir sunucu…

Uygulamanızı .Net ortamında geliştiriyorsanız SignalR teknolojisi sizi bu problemden kurtarabilir. SignalR bir .NET kütüphanesidir ve gerçek zamanlı çoklu kullanıcı web uygulamaları için harcanan kaynak maliyeti sorununa çözüm getiren bir socket teknolojisi olarak adlandırılabilir. Bir sunucu üzerinden haberleşmeye çalışan iki client, yeni bir mesajın sunucuda olup olmadığını kontrol etmek için belirli zaman aralıkları ile sunucuya ajax post ile istekte bulunur (Ajax long polling). Oluşan trafik ve kaynak tüketimi göz önünde bulundurulduğunda oldukça performans dışı bir sürecin gerçekleştiğini gözlemleyebiliriz. Tam bu noktada bu tip problemlere çözüm olacak teknolojilerden yalnızca bir tanesi olan SignalR devreye girebilir.

SignalR hosting için ASP.NET kullanım zorunluluğu yoktur. OWIN (Open Web Interface for .NET) kullanılarak da host edilebilir.

SignalR, haberleşme sırasında ilettiği datayı “Plain Text” yani text metnin en yalın hali olarak iletmeyi tercih ediyor. Eğer sıkıştırılmış bir içerikte gönderim yapılmak isteniyorsa hem sunucu hem de istemci tarafında ilgili logic’in yazılması gerekiyor. Peki, bu SignalR’ı nasıl kullanacağız? Cevap: WebSocket lerle :)

WebSocket

Yazının başında problemimizi tanımlamıştık. İstemci, her seferinde sunucu üzerinde bir değişiklik oldu mu? Bana yeni bir mesaj var mı sorusunu sorabilmek için sunucuya request ler gönderiyordu. Bu süreçte her request’in işlenmesini ve o requeste bağlı response ların dönmesini bekliyorduk. WebSocket tam da burada devreye giriyor. İstemci ve sunucu arasında kalıcı bir bağlantı açarak tüm request ve response lerın bu kanal üzerinden herhangi bir zamanda iletilmesini sağlıyor.

Resim.1 üzerinde webSocket için bir mimari gösterime yer verilmiştir.

Resim.1: WebSocket üzerinden mesajlaşma gösterimi

Daha resmi bir tanımla, Http protokolü üzerinden full-duplex (tam çift yönlü) iletişimi sağlayan protokoldür denilebilir. Client ve server arasında açık TCP bağlantısı kurar. Client, server’a bir kanal açarak request gönderir. Aynı kanal kullanılarak sunucudan client’a herhangi bir zamanda response dönülür. Bu nedenle webscoket protokolü için (bi-directional) çift yönlü haberleşme özelliğinden bahsedilir.

WebSocket protokü maalesef her tarayıcı tarafından desteklenmiyor. Aynı browser içerisinde de farklı sürümler arasında destek problemi oluşabiliyor. Aşağıda Resim.2 üzerinde websocket protokolü için destek veren tarayıcılar yer alıyor.

Resim.2: WebSocket protokol desteği veren tarayıcılar

Neden WebSocket?

- Kullanımı kolay

- Full Duplex (Çift yönlü haberleşme) yapısına sahip olduğu için kaynak tüketimini minimize ediyor

- Hızlı

Dezavantajları

Elbette her güzel yapının olduğu gibi webSocket kullanımı için de bazı özellikleri bulundurma zorunluluğu var. Mesela tarayıcınızın mutlaka HTML5 desteğinin olması gerekiyor. Kurumsal uygulamaların çoğu IE tarayıcısı üzerinde çalıştırılıyor.

IE 9 öncesi sürümlerinde HTML5 desteğinin olmadığı da bir gerçek. Dolayısıyla kurumsal firmaların alışkanlıkları nedeniyle en büyük dezavantajı burada sağlıyor diyebiliriz.

SignalR Hub Nedir?

Burada bahsedilen hub hepimizin aklına gelen hub :) Yani bir bağlantıyı n tane cihazın paylaşmasına olanak sağlayan yapının ta kendisi. SignalR hub nedir peki? Kafamızda canldırmak adına bir hub düşünelim; bu hub’a bağlı 4 tane client olsun. Client’lardan biri iletmek istediği mesajı hub’a göndererek mesajın hub’a bağlı tüm client’lara websocket bağlantısını kullanarak broadcast edilmesini sağlayabilir. Anlatmak istediğim yapıyı Resim.3 üzerinde göstermeye çalıştım. (Client-Hub Connection)

Resim.3: SignalR Hub

Toparlamak gerekirse, SignalR kullanarak sisteminize entegre etmek zorunda kaldığınız veya uzun sürecek kodlama işlemlerinden bütünüyle uzak durabilirsiniz. SignalR zaten paket olarak gerekli olan her şeyi kendi içerisinde barındırıyor. Bu işlemlerin tümünü uygulamak yerine sadece projenize ilgili kütüphaneyi ekleyerek kendi sürecinizi başlatabilirsiniz.

SignalR kurduktan sonra webSocket versiyonlarını güncelleme işi ile uğraşmak zorunda kalmazsınız. SignalR, içerisinde bulundurduğu bir arayüz ile webSocket güncellemelerinin tümünü kendi içerisine aktaracaktır.

--

--