Perché REST è comunemente usato al posto di meccanismi simili a RPC nelle applicazioni Web?


18

Ho iniziato di recente in un'azienda che utilizza un framework personalizzato piuttosto insolito per le loro applicazioni Web, almeno rispetto ai tipici framework di applicazioni Web che conosco. Invece di un servizio web RESTful viene utilizzato un meccanismo RPC per comunicare con il server.

La comunicazione con il server sembra una semplice chiamata di funzione, ma la funzione viene eseguita sul server, non sul client. Sul lato server c'è un modo per definire quali funzioni può chiamare il client. I dettagli su come questo viene tradotto in richieste http vengono completamente sottratti.

L'ho usato solo poco tempo fa, ma sembra abbastanza conveniente. Ma mi chiedo quali inconvenienti di questo approccio mi manchi. Tutti gli altri sembrano farlo diversamente, il che di solito è un segno per me che potrei fare qualcosa di stupido o brillante, con probabilità molto più alte sul primo.


5
Mi immagino (ma non sono sicuro al 100% quindi mi limiterò a lasciare questo come un commento e lascio qualcuno che davvero conosce la loro roba inviare una risposta adeguata) che il resto è utilizzato più di RPC perché interfacce resto sono di solito più semplice da implementare e sono meno dipendenti da specifici framework / tecnologie sottostanti.
FrustratedWithFormsDesigner

11
La mia impressione è che la maggior parte dei consumatori di REST si preoccupi più di avere una semplice API http + json che di REST stesso.
Codici A Caos

4
Perché l'intero settore è impazzito.
Mike Nakis,


1
Opinione controversa: per la maggior parte le differenze tra REST e RPC sono per lo più accademiche.
whatsisname

Risposte:


33

REST è stato progettato per il Web e il Web è stato progettato per REST. I due si adatteranno insieme. La tesi di dottorato di Roy Fielding del 2000, Stili architettonici e la progettazione di architetture software basate su rete, hanno definito e introdotto il termine REST , e vi è una significativa interazione tra il web e il REST: Roy Fielding ha lavorato su HTTP / 1.1, di cui è l'autore principale, e ha usato quello che ha imparato lì per descrivere REST nella sua tesi di laurea.

Quindi, la semplice ragione per cui il web e il REST vanno così bene insieme è che la definizione di REST è stata estratta da come funziona il web, e il web è un'implementazione di REST.

Ecco perché REST si adatta perfettamente ai servizi Web e alle app Web: perché fai semplicemente le stesse cose che hanno già dimostrato di funzionare nel web "umano" e le applichi al web "macchina".

Il grosso problema con RPC (a seconda dell'esatta implementazione) risiede essenzialmente nelle Fallacie del calcolo distribuito , che sono spiegate più in dettaglio in questo white paper di Arnon Rotem-Gal-Oz :

  1. La rete è affidabile
  2. La latenza è zero
  3. La larghezza di banda è infinita
  4. La rete è sicura
  5. La topologia non cambia
  6. C'è un amministratore
  7. Il costo del trasporto è zero
  8. La rete è omogenea

Questi sono tutti i presupposti che i nuovi arrivati ​​fanno in genere quando iniziano a creare sistemi distribuiti. Certo, sono tutti falsi. E devi tenerne conto tutti durante la creazione di sistemi distribuiti.

Il problema con molte implementazioni RPC è che provano a far apparire le chiamate remote come chiamate locali. Ma non sono niente simili:

  • una chiamata locale non fallisce mai; la subroutine che hai chiamato potrebbe non riuscire, ma la chiamata stessa non lo fa mai - una chiamata remota potrebbe perdersi sulla rete
  • una chiamata locale è istantanea; la subroutine che hai chiamato può funzionare a lungo (o anche per sempre se rimane bloccata in un loop infinito), ma la chiamata stessa non richiede affatto tempo (beh, una manciata di istruzioni CPU al massimo, meno se la chiamata è in linea, ma è molto veloce) - una chiamata remota potrebbe rimanere bloccata sulla rete per molto tempo
  • se la subroutine ritorna normalmente, il risultato ritorna sempre - con una chiamata remota, il risultato potrebbe perdersi sulla rete
  • i ritorni sono istantanei - i risultati remoti possono viaggiare sulla rete per molto tempo
  • se chiamo una subroutine una volta, verrà eseguita esattamente una volta: una chiamata remota potrebbe andare persa sulla rete o duplicata in modo che la routine remota possa essere eseguita tra 0 e un numero qualsiasi di volte
  • Ricevo esattamente un risultato: un risultato remoto potrebbe andare perso o duplicato, quindi potresti ottenere il risultato 0 o più volte
  • se chiamo una subroutine due volte, ottengo due risultati e ottengo il risultato della prima chiamata prima del risultato della seconda chiamata - probabilmente ora puoi indovinarlo: con RPC, potresti non ottenere alcun risultato, o solo la prima , o solo il secondo, o il secondo prima del primo, o il primo potrebbe andare perso e si ottiene il secondo due volte, o viceversa, e così via ...
  • se chiamo ae poi b, ottengo indietro il risultato ae poi il risultato di b - questa è solo una versione più generale del punto precedente, con RPC, puoi ottenere una delle due risposte 0 o più volte in qualsiasi ordine

Si dovrà fare i conti con tutto quanto sopra per una chiamata remota. Ma se il tuo framework rende le chiamate remote indistinguibili dalle chiamate locali, allora non puoi , perché non sai quali sono le chiamate remote. Il framework potrebbe provare a gestirli tutti per te, ma il problema è: il framework non conosce tanto il tuo sistema quanto te. Non sa se ci sono chiamate in cui in realtà non importa se ci si perde una volta ogni tanto. Quindi, il framework deve essere molto difensivo, e questo è costoso in termini di latenza e larghezza di banda.

Soprattutto perché il framework in realtà non può proteggerti. Il teorema della PAC afferma che un sistema distribuito non può essere coerente, disponibile e tollerante alla partizione allo stesso tempo; più precisamente, dice che una volta che si verifica una partizione, il sistema non può continuare ad essere sia coerente che disponibile, deve sceglierne una (contrariamente alla credenza popolare, il teorema non dice che non si possono avere tutte e tre, quando il sistema è in esecuzione normalmente, puoi averli tutti e tre; ma una volta che hai una partizione, devi scegliere una delle altre due). Il teorema PACELC estende il teorema della PAC dimostrando che anche quando il sistema funziona, è necessario bilanciare Latenza vs. Coerenza.

Questi sono importanti compromessi da cui il framework praticamente non può proteggerti, dal momento che sono specifici del dominio e importanti per la progettazione di base.

Questo contrasto con un approccio come Erlang di, che fa il lavoro: in Erlang, tutto messaggio invia sono trattati come a distanza, anche se sono locali. Ciò significa che sei sempre pronto ad affrontare tutti i problemi di cui sopra (e molti altri). Per i processi locali, tuttavia, ciò comporta un certo sovraccarico. A tale scopo, esistono numerosi strumenti, framework, librerie, schemi e modi di dire per gestire la gestione e la supervisione degli errori.

Non hai descritto come funziona il tuo framework RPC, e quale lingua o librerie stai usando, ma ho il forte sospetto che appartenga al precedente tipo "fingere che la rete non esista". Quelli semplicemente non funzionano. E ' giusto per rimuovere la distinzione tra chiamate locali e remoti trattando tutto ciò come a distanza di chiamata. Farlo il contrario abstracts troppo: la rete è parte del vostro sistema, se astratto via, è astratta via qualcosa che in realtà bisogno di conoscere.

Ora, se devi usare specificamente REST o meno, questa è una domanda completamente diversa. Come ho spiegato in precedenza, il web è stato progettato per il riposo e il riposo è stato progettato per il web, così i due fanno un senso insieme, ma è possibile utilizzare altri stili architettonici, se si vuole. Ma almeno una parte della tua domanda riguardava il "perché non l'RPC", e ho spiegato i motivi sopra, più precisamente ho spiegato perché il tipo di RPC che sospetto che stai usando potrebbe metterti nei guai.


Anche la standardizzazione non è un problema (dato che non esiste un mapping 1: 1 tra HTTP e RPC)?
Jimmy T.,

Bene, ci sono framework per modelli di attori che affrontano tutti questi problemi.
Robert Harvey,

Naturalmente, tutto ciò che serve è un individuo entusiasta per creare un livello di astrazione sull'interfaccia REST e diventa rapidamente indistinguibile da un'interfaccia RPC.
whatsisname

1
Un altro errore del calcolo distribuito: client e server si aggiornano contemporaneamente.
Jack,

@Jack: questo è ripreso dall'errore "C'è solo un amministratore". È menzionato nel white paper: ...
Jörg W Mittag,

5

Ci sono già diverse buone idee nei commenti, che ripeterò qui:

  1. RPC è in genere specifico della tecnologia.
  2. Ciò che gli sviluppatori sono maggiormente interessati è JSON, non REST.

JSON ha delle qualità molto belle. È semplice, facile da leggere per un essere umano, facile da analizzare per un computer, e Javascript lo riconosce istantaneamente in modo nativo (essendo, sai, notazione di oggetti Javascript ).

Se sei disposto a rinunciare a vincoli come REST, puoi fare quasi tutto quello che vuoi con JSON, comprese le chiamate di procedure remote. Tutto quello che devi fare è stabilire un protocollo adatto. In realtà, esiste già un protocollo del genere: JSON-RPC.

--> {"jsonrpc": "2.0", "method": "subtract", "params": [42, 23], "id": 1}
<-- {"jsonrpc": "2.0", "result": 19, "id": 1}

-1

RPC e REST sono solo approcci diversi con pro e contro ed entrambi sono valutabili a seconda del contesto. REST è meglio descritto per lavorare con le risorse, mentre RPC è più interessato alle azioni. I client RPC sono strettamente associati all'implementazione del servizio in diversi modi e diventa molto difficile cambiare l'implementazione del servizio senza interrompere i client.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.