Herkese merhaba. Bu yazıda gerçek zamanlı uygulama geliştirmek için kullanılan kütüphanelerden birisi olan SignalR kütüphanesini inceleyeceğiz. Gerçek zamanlı web, mobil uygulamaları artık günlük hayatımızın büyük bir kısmını oluşturmakta. Bu yüzden gerçek zamanlı uygulamaların teknoloji sektöründeki popülerliği hala devam ediyor. Anlık mesajlaşma, döviz takip, maç sonucu takip uygulamaları ve oyunlar gibi pek çok farklı sektörde kullanılan bu mekanizma aslında WebSocket ve RPC teknolojisine dayanmaktadır. Bu nedenle öncelikle WebSocket ve RPC yapılarına ardından da SignalR konusuna geçiş yapalım.

WebSocket ve RPC Nedir?

WebSocket, kullanıcının bilgisayarı ile server arasında çift yönlü etkileşimli bir iletişim kurulmasını sağlayan gelişmiş bir teknolojidir. Fakat, HTTP protokolündeki request ve response özelliğini birebir kullanmamaktadır. Bu yüzden kendi iletişiminde Hand Shake (el sıkışması) denilen bir yöntemi kullanır. Çift yönlü iletişimi daha iyi kavrayabilmek için HTTP protokol yapısı ile karşılaştırılmasını inceleyelim.

Http vs. WebSocket

Burada gördüğünüz gibi bir Http bağlantısında client üzerinden server’a bir istek gider. Server gelen isteğe uygun bir cevap üretir ve client’a gönderir. Response client’a ulaştığında bağlantı biter. WebSocket bağlantısında ise; yine client üzerinden server’a istek gider ve server bu isteğe yanıt olarak bir handshake gönderir. El sıkışma olarak tabir edebileceğimiz bu yanıt server ile client arasında güvenli, uyumlu ve etkili bir bağlantının başlatılmasını sağlar. Bu bağlantı client server’dan ayrılana kadar devam eder. WebSocket teknolojisi genellikle kullanılan programlama dillerine göre farklılık gösterir. Örneğin; .Net Core için SignalR, Node.js için Socket.IO veya ws, Python için WebSockets, ws4py ve PHP için Ratchet veya Phpws kullanılabilir. Buradan programlama dilinize uygun WebSocket teknolojisini bulabilirsiniz.

RPC Nedir?

RPC, bir client’ın uzaktaki bir sunucudaki bir işlemin kodunu çağırmasını ve sonuçlarını almasını sağlayan bir iletişim protokolüdür. Çalışma mantığını bir şema üzerinden inceleyelim.

  • Client, server’a erişmek için bir RPC isteği oluşturur. Bu istek uzak sunucudaki belirli bir işlemin adını ve çağırılan argümanlardan oluşur. Client, RPC isteğini sunucuya iletmek için bir RPC istemcisini kullanır.
  • Client tarafından oluşturulan RPC isteği, belirli bir RPC protokolü tarafından düzenlenir. Bu protokol, client ve server’ın iletişim kurduğu dil bağımsız bir yapı sağlar. (Bu kısım şemada Transport olarak gösterilmektedir.)
  • Server gelen RPC isteğini alır ve işlenmesi gereken işlemin adını ve argümanları çözümler. Server işlemi gerçekleştirir ve sonucu oluşturur.
  • Server işlem sonucunu RPC yanıtı olarak paketler ve client’a gönderir. Paketlenen RPC yanıtı da belirli bir RPC protokolü ile düzenlenir. Böylece client bu yanıtı anlar.
  • Client, uzaktaki sunucudan gelen RPC yanıtını alır. Client RPC yanıtını çözümler ve işlem sonuçlarını kullanır. Bu sayede işlem tamamlanır.

HTTP ve RPC farklı iletişim amaçlarına sahip protokollerdir. RPC programlar arasında işlev çağrıları yapmak için kullanılırken, HTTP web tabanlı uygulamalar için tasarlanmıştır. Fakat RPC protokolü farklı pek çok teknoloji ile birlikte kullanılabilir. Örneğin; RESTful web servisler veya gRPC gibi protokoller ile kullanıldığında, HTTP ile uygulamalar arasında iletişim kurmak için kullanılır.

SignalR nedir?

SignalR, gerçek zamanlı uygulamalar geliştirmek için oluşturulan açık kaynaklı bir .NET kütüphanesidir.  Request ve Response yerine WebSocket özelliğini kullanır. Bu sayede client tarafında JavaScript ile server çağrısı yapılırken, bir veride değişiklik olduğunda server ilgili JavaScript metodunu çağırarak client’lara haber verir. Dolayısıyla uygulama içerisinde çift taraflı gerçek zamanlı iletişim başlar ve sayfanın yenilenmesine gerek kalmaz. SignalR’ın çalışma mantığını anlamak için aşağıdaki şemayı inceleyelim.

Uygulamamızın bir chat uygulaması olduğunu varsayalım. Client’lar birbirleriyle sohbet etmek için bizim ChatHub hub’ımıza bağlanırlar. ChatHub’ımızın içindeki GetMessages metoduyla, sohbet odasındaki mesajları dönüyoruz. Client1 sohbet odasına girdiğinde Hub’a erişmek için çağrı yapar. Bu işlem ileyukarıda bahsettiğim “el sıkışma” işlemi tamamlanır. Bağlantı kurulduktan sonra client ChatHub içerisindeki GetMessages metodunu invoke eder ve RecieveMessages metoduna subscribe (abone) olur. Hub tarafında metot içerisindeki işlemler tamamlandıktan sonra client tarafındaki ReceiveMessages metodunu uyarır. Client bu sayede sohbet odasındaki mesajları almaya başlar. Client1 sohbet odasında mesaj yazmaya başladığında diğer client’lar ReceiveMessages metoduna subcribe olduğu için Client1’in mesajları onlarda da görünmeye başlar.

SignalR Avantajları/Dezavantajları

SignalR’ın avantajlarını aşağıdaki gibi sıralayabiliriz;

  • Bağlantıların otomatik olarak yönetilmesini sağlar. Bu sayede bağlantı kesintileri ve değişen ağ koşulları gibi durumları otomatik olarak yönetir.
  • Sunucu ve istemci arasında gerçek zamanlı iletişim kurmamıza yardımcı olur. Bu sayede canlı sohbet uygulamaları, anlık bildirimler ve etkileşimli oyunlar gibi senaryolarda kullanılabilir.
  • Farklı istemci ve sunucu platformlarında çalışabilme yeteneğine sahiptir. Bu esneklik, uygulamanızı daha geniş bir kullanıcı kitlesine ulaştırmak için önemlidir.

Dezavantajları ise;

  • Gerçek zamanlı iletişimde sürekli bağlantılar sürdürmek sunucu yükünü artırabilir. Dolayısıyla büyük bir kullanıcı trafiği veya karmaşık işlemler sunucunun performansını etkiler.
  • SignalR genellikle modern tarayıcılarla iyi çalışsa da, eski tarayıcılar veya özelleştirilmiş tarayıcılarla uyumluluk sorunları yaşanabilir.
  • SignalR’ı kullanmaya başladığınızda, uygulamanız bu teknolojiye bağımlı hale gelebilir ve daha sonra değişiklikler yapmak zor olabilir.

SignalR’ın kullanımını incelemek için oluşturduğum CovidChart uygulamasını inceleyebilirsiniz. Bir sonraki yazıya kadar kendinize çok iyi bakın! 😊