Estoy diseñando una API REST para un sistema de tres niveles como: Client application
-> Front-end API cloud server
-> user's home API server (Home)
.
Home
es un dispositivo doméstico, y se supone que mantiene la conexión a Front-end
través de Websocket o una encuesta larga (este es el primer lugar donde estamos violando REST. Más adelante empeora) . Front-end
la mayoría de las veces hace un túnel Client
para las solicitudes de Home
conexión y maneja algunas de las llamadas en sí. A veces Home
envía notificaciones a Client
.
Front-end
y Home
tiene básicamente la misma API; Client
podría estar conectando Home
directamente, a través de LAN. En este caso, Home
necesita registrar algunas Client
acciones en Front-end
sí mismo.
Los pros para REST en este sistema son:
- REST es legible por humanos;
- REST tiene un mapeo bien definido de verbos (como CRUD), sustantivos y códigos de respuesta a objetos de protocolo;
- Funciona a través de HTTP y pasa todos los proxies posibles;
Los contras de REST son:
- No solo necesitamos un estilo de comunicación de solicitud-respuesta, sino también una publicación-suscripción;
- Los códigos de error HTTP pueden ser insuficientes para manejar errores de comunicación de tres niveles;
Front-end
podría volver202 Accepted
a alguna llamada asincrónica solo para descubrir que laHome
conexión necesaria está interrumpida y debería haberla503
; Home
necesita enviar mensajes aClient
.Client
tendrá que sondearFront-end
o mantener una conexión.
Estamos considerando WAMP / Autobahn sobre Websocket para obtener la funcionalidad de publicación / suscripción, cuando me di cuenta de que ya parecía una cola de mensajes.
¿Vale la pena evaluar una especie de cola de mensajes como transporte?
Parece que los contras de la cola de mensajes son:
- Necesitaré definir verbos CRUD y códigos de error yo mismo a nivel de mensaje.
- Leí algo sobre "mayor costo de mantenimiento", pero ¿qué significa?
¿Qué tan serias son estas consideraciones?
@Jimmy Hoffa
punto válido, gracias. Eso es correcto, pero no completamente. Es una base de datos común, almacenamiento, etc. @Javier
gracias, es una buena parte de una respuesta.
@Mike Brown
exactamente. Por favor, hazlo.