Performans, SignalR'yi (websockets) tamamen geleneksel bir REST API'sinin yerine kullanmamak için mi kullanıyor?


42

Ben kullandım SignalRbenim projelerin birkaç gerçek zamanlı mesajlaşma işlevselliği elde etmek. Güvenilir bir şekilde çalışıyor gibi görünüyor ve kullanmayı öğrenmek çok kolay.

En azından benim için cazip bir Web API hizmeti geliştirmeyi bırakmak ve SignalRher şey için kullanmaktır .

Bunun düşünceli tasarımla elde edilebileceğini hissediyorum, ve öyle olsaydı, müşteri kodunun daha az gerekli olacağı anlamına gelirdi. Daha da önemlisi, bölünmüş bir arayüzden ziyade hizmetlere tek bir arayüzün olacağı ve en kötü durumda, işler ne zaman ortaya çıkacağını düşünmeden bunu bir araya getirebileceği anlamına gelir .

Bu yüzden bilmek istiyorum:

  1. SignalR'ı performansın yanı sıra tüm web servisleri yerine kullanmamak için başka bir neden var mı?
  2. SignalR'ın performansı, bunun mantıklı olmayacağı konusunda yeterince yeterli mi?

Sunucu tarafı nesne ve hizmet tanımlarını müşteri tarafı hizmet erişim koduna aptalca bir şey olmadan tercüme edebilmek çok uzun zamandır hayalimdi node.js. İlginç bir nesneyi tanımlamak Örneğin, InterestingObjectve bir hizmet CRUDnesnesi InterestingObjectService, ben hizmetine bir standart URL rol tanımlayabilir - söz hakkından, "/ {serviceName} / {methodName}" - ama hala erişime yazma istemci koduna gerek hizmet. Nesne sunucu ve arkasına istemciden geçirilen olacak beri hiçbir pratik sebep yoktur sahipnesneyi açıkça istemci tarafı kodunda tanımlamak için de, CRUD işlemlerini gerçekleştirme yollarını açıkça tanımlamaya gerek duyulmamalıdır. Bunları standardize etmenin bir yolu olması gerektiğini düşünüyorum, böylece hizmet erişiminin istemciden sunucuya çalıştığını ve bir WinForms veya Java yazıyormuş gibi yaptığım gibi şeffaf bir şekilde geri döndüğünü varsayarak bir müşteriye yazmanın mümkün olduğunu düşünüyorum. Applet veya Native App veya neyin var.

SignalR geleneksel bir web servisi yerine kullanmak için yeterince iyi ise, bunu başarmak için uygun bir yol olabilir. SignalR, hub'ın tanımladığım hizmette çalışmasını sağlayacak bir işlevsellik içeriyor; bu nedenle, tüm bu işlevselliği bir parça yansıması ile birlikte sunabilecek ortak bir temel (CRUD) hizmeti tanımlayabilirim. O zaman neredeyse hizmete erişim yetkisi alabilir, bana kongre tarafından erişilebilecek bir şeye erişmek için yeniden yazma kodundaki sıkıntıdan kurtulabilirdim - ve daha da önemlisi, bunun nasıl güncelleneceğini tanımlamak için kod yazmak için harcayacağım zaman DOM.

Düzenlememi okuduktan sonra biraz saçma olabileceğimi hissediyorum, bu yüzden neye bulaştığım hakkında sorularınız olursa bana sormaktan çekinmeyin. Temel olarak, servis erişiminin mümkün olduğunca şeffaf olmasını istiyorum.


5
Sınırsız sayıda soket açık tutabilen büyülü bir ağ kartınız ve sonsuz miktarda bant genişliğini destekleyebilen büyülü bir ağınız ve sınırsız miktarda hafıza ve işlemci döngüleri olan büyülü bir sunucunuz varsa, web siteleri yalnızca harika bir seçimdir!

Csla istediğini yapar, iş nesneleri kendilerini istemci ve sunucu arasında taşıyabilir.
Andy

Yanıtlar:


50

Bu iki teknolojinin çok farklı bir amacı var.

  • REST, müşterinin değişimin aktif bir aktörü olmasıyla birlikte bir API'ye yapılan normal çağrılar içindir . İstemcinin bir adresin GPS koordinatlarını bulması gerektiğinde, istemci API'ye çağrı başlatır ve koordinatları alana veya bir hata meydana gelene veya bir zaman aşımı sona erene kadar bekler.

  • Web soketleri, işleri tersi yönde yapmak için gereken her şey içindir. Örneğin, bana gerçek zamanlı olarak günlükleri ve farklı sunucuların performansını gösteren bir intranet web sitesi kullandığımda , istemci pasif olabilir ve sunucu ona yeni yayınlanan bir günlük mesajı veya performans ölçümleri gönderinceye kadar bekleyebilir.

Fark açıktır: ilk durumda, müşteri belirli bir bilgiye ihtiyaç duyduğu zaman karar verir; İkinci durumda, müşteri sadece temasa geçmeyi bekler ve ne zaman olacağını bilemeyebilir.

Bir şekilde, ikisi de birbiriyle değiştirilebilir: gerek duymadığınızda web soketlerini uygulayabilirsiniz (yani, istemci REST araması yapmak yerine sunucuyu web soketleri aracılığıyla arayacak) ve yerine yoklama veya uzun yoklamayı kullanabilirsiniz. web soketleri (bunun web soketleri bu kadar popüler hale gelene kadar yıllarca başarıyla kullanıldığı düşünülürse).

Ancak birbirlerinin değiştirilebilirliği bir bedeli var:

  • Web soketleri yerine yoklama veya uzun yoklama kullandığınızda, genellikle bant genişliğini boşa harcarsınız.

  • Web api ile yapılabilecekleri yapmak için web soketlerini kullandığınızda, aktif olan istemcilerden gelen tüm bağlantıları açmış olursunuz, ki bu gerçekten istediğiniz şey olmayabilir. Aynı anda en fazla 5 müşterinin olmasını beklediğiniz küçük bir web sitesi için bu bir sorun değil. Amazon AWS gibi bir servis için bunun teknik olarak çözülmesi kolay olmaz.

İhtiyacınız olmadığında web soketlerini kullanmayın. Bir adresin GPS koordinatlarını almak için web soketleri bağlantısı açma, arama yapma, cevap bekleme ve bağlantıyı kapatma konularında hiçbir şey kazanmıyorum: REST bu tür senaryolara olan ihtiyacımı karşılıyor.

  • Kendinizi tekrar tekrar buluyorsanız ve sık sık REST çağrısı ile bir servise gelen bilgileri kontrol ediyorsanız, web soketlerine gitmeniz gerektiğini gösteren iyi bir işaret olabilir. Benzer şekilde, Yığın Taşması web soketlerini kullanarak bant genişliği kullanımını azaltır, çünkü insanların yeni mesajlarını alıp almadıklarını görmek için ana sayfada F5 tuşuna basarak zamanlarını harcamamalarına yardımcı olur.

  • Web soketi bağlantılarını açtığınızı tespit ederseniz, bunları tek bir arama yapmak için kullanın ve ardından bunları kapatın veya bağlantılarınız açık kalır ancak sunucu istemciye yalnızca müşterinin isteği üzerine bir şey gönderiyorsa, REST'e geçin.

Ayrıca, web soketleri hala sınırlı bir desteğe sahiptir ve uygulanması her zaman kolay değildir. SignalR uygulaması kolaylaştıracak olsa da, bu onu diğer dillerde / bağlamlarda / ortamlarda uygulamakta zorlanmayacağınız anlamına gelmez. REST ile bu kolay: curlher ana dilde mevcut olan bir arama veya benzeri bir özellik olabilir . Web soketleri ile bir müşteriyi [buraya henüz bilmediğiniz bir dilin adını girin] kullanarak yapmak için ne kadar zaman alacağından emin olamazsınız.

.NET, Python ve node.js.'deki birçok projede web soketlerini kullandım.

  • .NET'te çok zor değildi, ancak yine de, birkaç gün boyunca bağlantı açıldığı anda kesilen bağlantı gibi bazı şifreli sorunları bulmaya çalışıyorum. (Bu SignalR'dan önceydi; SignalR'ı hiç denemedim). Ayrıca WCF'yi web soket modunda da kullandım, bu da sorunsuz değildi (ama WCF'nin her zaman sorunla geldiğine inanıyorum ).

  • Node.js dosyasında bu yapılabilir, ancak hangisinin işe yaradığını bulana kadar iki kez kitaplığı değiştirmek zorunda kaldım. En azından bir hafta boyunca bir web soketi yapmaya çalışarak Hello World'ü düşünüyorum.

  • Python'da bir kez denedim, iki ya da üç gün geçirdim ve terk ettim. Asla işe yaramadı.

Bunu REST ile karşılaştırın: yeni bir dille / çerçeveyle karşılaşabilecek tek sorun, POST dosyalarını nasıl tanıyacağınızı ya da çok büyük bir ikili yanıt alabilmektir. Bazı dilleri bulmak için birkaç saat harcadığımı hatırlıyorum. Yine de, özel bir durum için birkaç saat, basit bir Merhaba Dünya için günler veya haftalarla karşılaştırıldığında hiçbir şey değildir.


2
Cevabınızı yükselttim, MainMa, ilginç / yararlı buldum. Anlamadığım bir nokta var. Çok az sayıda müşterinin web soketlerini (örneğin, aynı anda en fazla 5 adet) işlemesi için uygun olduğunu söylersiniz. Sonra StackOverflow'un ana sayfasında web soketleri kullandığından bahsettiniz. Bu kadar çok sayıda kullanıcıyı nasıl idare ediyorlar? Soruyorum çünkü 20'den fazla SignalR bağlantısı kurmaya çalışıyorum ve mesaj gecikmeleri yavaş yavaş artmaya başlıyor, her şey çökmeden önce (her şey tepkisiz).
gnychis

1
@gnychis: Bunun için pek çok çözüm var, ancak birçoğu altyapının kendisi ile daha ilgili ( serverfault.com bunun içindir). Genel olarak, daha fazla donanım atıp kullanıcıları alanlara ayırın, böylece bazı bağlantılar sockets1.example.com, diğerleri sockets2.example.com, vb. Tarafından yapılır. Oldukça etkili ancak donanım ve bant genişliği açısından da oldukça pahalıdır.
Arseni Mourzenko

3
Bu cevap mükemmel, ancak orijinal soruyu daraltmak istiyorum. Bir uygulama sürekli bir websocket bağlantısı gerektiriyorsa , o zaman neden tamamen REST API yerine websockets kullanmıyorsunuz? Bir websocket açık olduğundan, belki de tamamen kullanılmalıdır.
HappyNomad

Sadece kendi soruma bir cevap buldum .
HappyNomad

1

Sadece 2 sentim ...

Bence bu gerçekten performansla ilgili değil ya da her neyse. Bu standartlarla ilgili. REST standarttır ve IMHO aşağıdaki avantajlara sahiptir:

  • HTTP isteklerinin kullanımı kolaydır. Herkes hızlı bir şekilde REST API'sini kullanabilir. Heck, tarayıcıyı açıp verileri görmek için bir URL bile yazabilirsiniz, ne kadar etkileşimli olabilirsiniz?
  • (Neredeyse) herhangi bir programlama dili kullanabilir. Bu bir tür evrensel arayüz. Egzotik bir dilden SignalR ile arabirim daha az belirgin görünüyor.
  • Http://petstore.swagger.wordnik.com/ gibi güzel bir takım desteğine sahip
  • Hata ayıklamak için güzel bir "arayüz". Gelen ve giden mesajları doğrudan tarayıcıda kolayca izleyebilir, verileri görebilir vb. İzleyebilirsiniz.

1
REST API'leri biraz daha basit ve muhtemelen daha iyi takımlara sahip olduğunuz konusunda bazı iyi noktalar olsa da, bu cevap doğru olmayan birkaç şey olduğunu söylüyor. REST bir standart değildir , oysa WebSockets'tir .
StriplingWarrior,

1
Sanırım benim açımdan kötü sözler oldu. "Standart" ile kastettiğim, yaygın kullanılan, yaygın olarak kullanılan, bir şeyler yapmanın varsayılan yolu ... "RFC Standardı" değil.
dagnelies

İyi açıklama. Ve, btw, Chrome en azından WebSockets trafiğini geliştirme araçlarında görmenize izin veriyor. Diğer tarayıcıların da muhtemelen yaptığını hayal ediyorum.
StriplingWarrior
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.