REST o una coda di messaggi in un sistema eterogeneo a più livelli?


9

Sto progettando un'API REST per un sistema a tre livelli come: Client application-> Front-end API cloud server-> user's home API server (Home).

Homeè un dispositivo domestico e dovrebbe mantenere la connessione Front-endtramite Websocket o un lungo sondaggio (questo è il primo posto in cui stiamo violando REST. In seguito peggiorerà ancora) . Front-endper lo più tunnel Clientrichieste di Homeconnessione e gestisce alcune delle chiamate stesse. A volte Homeinvia notifiche a Client.

Front-ende Homehanno sostanzialmente la stessa API; Clientpotrebbe connettersi Homedirettamente, tramite LAN. In questo caso, è Homenecessario registrare alcune Clientazioni su Front-endse stesso.

I pro per REST in questo sistema sono:

  • REST è leggibile dall'uomo;
  • REST ha una mappatura ben definita di verbi (come CRUD), nomi e codici di risposta agli oggetti del protocollo;
  • Funziona su HTTP e passa tutti i possibili proxy;

I contrasti REST sono:

  • Abbiamo bisogno non solo di uno stile di comunicazione richiesta-risposta, ma anche di un abbonamento di pubblicazione;
  • I codici di errore HTTP potrebbero non essere sufficienti per gestire gli errori di comunicazione a tre livelli; Front-endpotrebbe tornare 202 Acceptedad alcune chiamate asincrone solo per scoprire che la Homeconnessione necessaria è stata interrotta e che avrebbe dovuto esserci 503;
  • Homedeve inviare messaggi a Client. Clientdovrà effettuare il polling Front-endo mantenere una connessione.

Stiamo prendendo in considerazione WAMP / Autobahn su Websocket per ottenere la funzionalità di pubblicazione / sottoscrizione, quando mi è sembrato che sembri già una coda di messaggi.

Vale la pena valutare una sorta di coda di messaggistica come trasporto?

Sembra che i contras della coda dei messaggi siano:

  • Dovrò definire personalmente i verbi CRUD e i codici di errore a livello di messaggio.
  • Ho letto qualcosa su "costi di manutenzione più elevati", ma cosa significa?

quanto sono serie queste considerazioni?


1
Perché hai un server cloud nel mix? Sembra tutto ciò che fa è il reindirizzamento che mi fa pensare che dovrebbe plausibilmente vivere sulla stessa macchina del server di casa ...
Jimmy Hoffa,

3
quando si analizzano le code dei messaggi, si noti che la maggior parte di essi è ottimizzata per le LAN private: client a bassa latenza, controllati, reti protette, ecc. esporre la coda a Internet può essere un grosso problema di sicurezza.
Javier,

@Jimmy Hoffapunto valido, grazie. Esatto, ma non completamente. È un database comune, archiviazione e così via. @Javiergrazie, è una buona parte di una risposta.
Victor Sergienko,

Il server principale è progettato per essere eseguito a casa di alcuni utenti e nel front-end nel cloud? La casa si connette al front-end e il client invia messaggi a casa tramite il front-end. Se capisco correttamente il tuo design, posso dare una risposta divina.
Michael Brown,

@Mike BrownEsattamente. Per favore fallo.
Victor Sergienko,

Risposte:


5

Se hai la connettività, vai con una coda di messaggi - anche se devi definire i tuoi protocolli (difficilmente un compito difficile!) Per inviare messaggi di una struttura e un formato particolari.

Il problema con la manutenzione è che in genere il client e il server sono costruiti separatamente, quindi è necessario fare attenzione a mantenere entrambe le estremità utilizzando le stesse definizioni dei messaggi, ma se non si è abbastanza organizzati, utilizzare semplicemente lo stesso XML che si utilizzerebbe nel REST servizio.

Se hai problemi di connettività su Internet, con la sola porta 80 e http e le comunicazioni "unidirezionali", un sistema in stile REST è probabilmente il migliore. Invia e fai polling, oppure ottieni un websocket per i dati di callback, ma in genere architetti il ​​tuo sistema come client / server. Se hai la possibilità di ottenere la connettività, i sistemi di messaggistica sono fantastici.

Andrei con ZeroMQ per un sistema di messaggistica, abbastanza configurabile per girare in tutti i tipi di scenari, compresi quelli a tolleranza d'errore. Non sono sicuro che funzioni su http però.


Grazie. Cosa ho trovato dopo il @Javiercommento: ØMQ sembra non supportare la crittografia stessa atm: zeromq.org/area:faq#toc8 sebbene RabbitMQ lo faccia: rabbitmq.com/ssl.html
Victor Sergienko,

Non so se ho la connettività. Homeè un dispositivo di casa dell'utente ed Clientè uno smartphone tramite Wi-Fi o 3G. Una grande parte della domanda è la mia ignoranza su metodi di attraversamento NAT.
Victor Sergienko,

5

Sembra che Autobahn si adatti perfettamente a ciò che stai cercando di fare. Ci sono anche altri strumenti disponibili. Dai un'occhiata al bus di servizio di Windows Azure (che ha framework client per Java, .NET, PHP, Python, NodeJS e Ruby).

Mentre i messaggi di riposo integrati sono utili. Scoprirai che la tua applicazione supererà le operazioni CRUD di base. Ad esempio se la tua domanda fosse un sistema bancario. Invece di

Aggiorna acc. 54321 Saldo = Saldo - 20,00 Aggiorna acc. 98765 Saldo = Saldo + 20,00

Probabilmente vorresti un singolo messaggio come

Trasferisci 20.00 dall'account 54321 all'account 98765

È meglio scoprire questo impedimento con REST ora piuttosto che dopo. Dai un'occhiata a Greg Young's Event Centric che spiega come creare un modello più ricco di messaggistica all'interno della tua applicazione.


Molte grazie. In effetti, potremmo superare CRUD, anche se non molto presto, il nostro dominio è piuttosto semplice ora. A proposito, il libro non è ancora stato pubblicato, provando a trovare alcuni annunci nel blog di Greg ... Penso che sia buono non devo usare la tecnologia Microsoft per questo.
Victor Sergienko,

Aspetta che il suo libro non sia ancora uscito ... ne parla da così tanto tempo ... sembra un altro autore tecnico che conosco. : ">
Michael Brown,

1
Per la cronaca, l'approccio REST sarebbe quello di avere una risorsa di trasferimento che si crea. O anche un TransferRequest che può passare o meno. REST diventa complicato in alcuni casi, ma questo non è uno di questi.
Jacek Gorgoń,
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.