La performance è l'unica ragione per non utilizzare SignalR (websockets) al posto di una tradizionale API REST?

39

Ho usato SignalR per ottenere funzionalità di messaggistica in tempo reale in molti dei miei progetti. Sembra funzionare in modo affidabile ed è molto facile da imparare da usare.

La tentazione, almeno per me, è di abbandonare lo sviluppo di un servizio API Web e utilizzare SignalR per tutto.

Credo che questo potrebbe essere ottenuto con un design accurato, e se lo fosse, significherebbe molto meno codice cliente sarebbe necessario. Ancora più importante, significherebbe che ci sarebbe una singola interfaccia per i servizi piuttosto che un'interfaccia divisa, e nel peggiore dei casi, che si potrebbe collegare a questo senza pensare a quando le cose vengono renderizzate, ecc.

Quindi, vorrei sapere:

  1. C'è qualche altra ragione per non utilizzare SignalR al posto di tutti i servizi Web oltre alle prestazioni?
  2. Le prestazioni del SignalR sono sufficientemente rilevanti da non avere senso farlo?

È stato a lungo mio sogno riuscire a tradurre le definizioni di oggetti e servizi lato server sul codice di accesso al servizio lato client senza qualcosa di stupido come node.js . Ad esempio, se definisco un oggetto interessante InterestingObject e un servizio a CRUD l'oggetto InterestingObjectService , posso definire una route URL standard per il servizio, ad esempio "/ {serviceName} / {methodName}", ma Devo ancora scrivere codice client per accedere al servizio. Poiché l'oggetto verrà passato da client a server e viceversa, non c'è alcun motivo pratico per avere per definire l'oggetto esplicitamente nel codice lato client, né dovrebbe esserci la necessità di definire esplicitamente il percorsi per eseguire operazioni CRUD. Mi sembra che ci dovrebbe essere un modo per standardizzare tutto questo in modo che sia possibile scrivere un client partendo dal presupposto che l'accesso al servizio funzioni dal client al server e viceversa in modo trasparente come se scrivessi un WinForm o Java Applet o app nativa o cosa hai.

Se SignalR è abbastanza buono da utilizzare al posto di un servizio web tradizionale, potrebbe essere un modo valido per raggiungere questo obiettivo. SignalR include già funzionalità per far funzionare l'hub come il servizio che descrivo, quindi potrei definire un servizio di base comune (CRUD) che offra tutte queste funzionalità out-of-the-box con una certa riflessione. Quindi potevo quasi dare per scontato l'accesso al servizio, risparmiandomi il fastidio di riscrivere il codice per accedere a qualcosa a cui si poteva accedere per convenzione - e ancora più importante, il tempo che avrei dovuto dedicare alla scrittura del codice per definire come viene aggiornato in il DOM.

Dopo aver letto la mia modifica mi sembra che possa essere un po 'priva di senso, quindi non esitare a chiedermi se hai domande su cosa sto ottenendo. Fondamentalmente, voglio che l'accesso al servizio sia il più trasparente possibile.

    
posta tacos_tacos_tacos 07.11.2014 - 11:39
fonte

2 risposte

48

Queste due tecnologie hanno uno scopo molto diverso.

  • REST è per le normali chiamate a un'API, con il cliente come attore attivo dello scambio. Quando il cliente ha bisogno di trovare le coordinate GPS di un indirizzo, il client avvia la chiamata all'API e attende fino a quando non riceve le coordinate, o si verifica un errore o trascorre un timeout.

  • I socket Web sono per tutto ciò che deve fare le cose nel modo opposto. Ad esempio, quando utilizzo un sito Web intranet che mostra in tempo reale i registri e le prestazioni di diversi server, il client potrebbe essere passivo e attendere che il server gli invii un messaggio di registro o un rendimento appena pubblicati metriche.

La differenza è chiara: nel primo caso, il cliente decide quando ha bisogno di un'informazione specifica; nel secondo caso, il cliente aspetta semplicemente di essere contattato e potrebbe non sapere quando lo sarebbe.

In un certo senso, entrambi sono intercambiabili: è possibile implementare i socket Web quando non sono necessari (ovvero il client chiamerà il server tramite socket Web anziché effettuare una chiamata REST) e sarà possibile utilizzare il polling o il polling lungo come un sostituto per i socket web (dato che questo è stato usato con successo per anni fino a quando le web socket sono diventate così popolari).

Ma la loro intercambiabilità ha un costo:

  • Se utilizzi il polling o il polling lungo anziché i socket Web, stai spesso sprecando larghezza di banda.

  • Quando si utilizzano i socket Web per fare ciò che può essere fatto tramite web api, si mantengono tutte le connessioni da tutti i client attivi aperti, il che potrebbe non essere quello che si vuole veramente. Per un piccolo sito Web in cui ci si aspetta di avere al massimo 5 client contemporaneamente, questo non è un problema. Per un servizio come Amazon AWS, questo non sarebbe facile da risolvere tecnicamente.

Non utilizzare prese di rete quando non ne hai bisogno. Per ottenere le coordinate GPS di un indirizzo, non guadagno nulla nell'aprire la connessione web socket, effettuare la chiamata, attendere una risposta e chiudere la connessione: REST soddisfa le mie esigenze per tali scenari.

  • Se ti trovi ripetutamente e frequentemente a cercare informazioni tramite una chiamata REST a un servizio, questo potrebbe essere un buon segno che devi passare alle prese web. Allo stesso modo, Stack Overflow riduce l'utilizzo della larghezza di banda utilizzando i socket Web, poiché aiuta le persone a non spendere il loro tempo premendo F5 sulla home page per vedere se hanno nuovi messaggi.

  • Se si scopre di aprire connessioni socket Web, usarle per effettuare una singola chiamata e quindi chiuderle oppure se le connessioni rimangono aperte ma il server invia qualcosa al client solo su richiesta del client, passare per REST.

Inoltre, i socket Web hanno ancora un supporto limitato e non sono sempre facili da implementare. Sebbene SignalR sia facile da implementare, ciò non significa che non avrai alcuna difficoltà ad implementarlo in altre lingue / contesti / ambienti. Con REST, è facile: potrebbe essere una chiamata curl o una funzionalità simile disponibile in tutte le lingue tradizionali. Con i socket Web, non puoi essere sicuro di quanto tempo occorrerebbe per far utilizzare un client [inserire il nome di una lingua che non conosci ancora qui].

Ho usato socket Web in diversi progetti in .NET, Python e node.js.

  • In .NET, non era troppo difficile, ma ho comunque passato qualche giorno a cercare di capire alcuni problemi criptici, come la connessione caduta non appena viene aperta. (Questo era prima di SignalR, non ho mai provato SignalR). Ho anche usato WCF in modalità web socket, che non era privo di problemi (ma credo che WCF always abbia problemi).

  • In node.js, questo era fattibile, ma ho dovuto passare due volte alle librerie finché non ne ho trovato uno che funzioni. Credo di aver passato almeno una settimana a cercare di creare una presa telefonica Hello World.

  • In Python, ho provato una volta, trascorso due o tre giorni e abbandonato. Non ha mai funzionato.

Confronta questo con REST: gli unici problemi che si possono incontrare con un nuovo linguaggio / framework sono sapere come inviare file POST o ricevere una risposta binaria molto grande. Ricordo di aver trascorso alcune ore alla ricerca di soluzioni per alcune lingue. Tuttavia, poche ore per un caso speciale non sono nulla rispetto ai giorni o alle settimane per un semplice Hello World.

    
risposta data 07.11.2014 - 16:21
fonte
1

Solo i miei 2 centesimi ...

Penso che non si tratti davvero di prestazioni o di qualsiasi cosa. Si tratta di standard. REST è uno standard e IMHO ha i seguenti vantaggi:

  • Le richieste HTTP sono semplici da usare. Tutti possono utilizzare rapidamente un'API REST. Diamine, puoi persino aprire il browser e digitare un URL per vedere i dati, quanto più interattivo puoi essere?
  • (Quasi) qualsiasi linguaggio di programmazione può usarlo. È una specie di interfaccia universale. Interfacciare con SignalR da un linguaggio esotico sembra meno ovvio.
  • Ha un buon supporto per gli strumenti, come link
  • È una buona "interfaccia" per il debug. Puoi monitorare facilmente i messaggi in entrata e in uscita direttamente nel browser, vedere i dati, ecc. Con websocket e librerie personalizzate, non è così ovvio, devi registrare tutto in modo esplicito.
risposta data 07.11.2014 - 15:31
fonte

Leggi altre domande sui tag