WAMP es un subprotocolo de WebSocket registrado en IANA , [ 1 ] especificado [ 2 ] para ofrecer RPC enrutado y PubSub . Su objetivo de diseño [ 3 ] es proporcionar un estándar abierto para el intercambio de mensajes flexibles y en tiempo real entre componentes de aplicaciones y facilitar la creación de arquitecturas débilmente acopladas basadas en microservicios . Debido a esto, es un bus de servicios empresariales (ESB) adecuado, [ 4 ] apto para desarrollar aplicaciones web responsivas o coordinar múltiples dispositivos IoT conectados. [ 5 ]
Características
Estructura
WAMP requiere [ 6 ] un canal de mensajes dúplex completo , ordenado y confiable como capa de transporte y, por defecto, utiliza Websocket. Sin embargo, las implementaciones pueden usar otros transportes que coincidan con estas características y comunicarse con WAMP a través de, por ejemplo, sockets sin procesar, [ 7 ] sockets Unix o sondeo largo HTTP .
La serialización de mensajes asume que [ 8 ] están disponibles los tipos de enteros, cadenas y secuencias ordenadas, y utiliza JSON por defecto como el formato más común que los ofrece. Las implementaciones suelen proporcionar MessagePack como una alternativa más rápida a JSON a costa de una dependencia adicional. [ 9 ]
Flujo de trabajo
WAMP está diseñado en torno a comunicaciones cliente-cliente con un software central, el enrutador, que distribuye mensajes entre ellos. El flujo de trabajo típico de intercambio de datos es: [ 10 ]
- Los clientes se conectan al enrutador mediante un protocolo de transporte, estableciendo así una sesión.
- El enrutador identifica a los clientes y les otorga permisos para la sesión actual.
- Los clientes envían mensajes al enrutador, que los distribuye a los destinos adecuados utilizando las URI adjuntas.
Los clientes envían estos mensajes utilizando las dos primitivas de alto nivel que son RPC y PUB/SUB, realizando cuatro interacciones principales:
- registro : un cliente expone un procedimiento para ser llamado de forma remota.
- llamada : un cliente le pide al enrutador que obtenga el resultado de un procedimiento expuesto de otro cliente.
- suscribirse : un cliente notifica su interés en un tema.
- publicar : un cliente publica información sobre este tema.
Esto puede tener variaciones sutiles dependiendo del transporte subyacente. [ 11 ] Sin embargo, los detalles de implementación están ocultos para el usuario final que solo programa con las dos primitivas de alto nivel que son RPC y PubSub.
Seguridad
Dado que WAMP utiliza WebSocket, las conexiones se pueden cifrar mediante TLS . Incluso cuando no se garantiza la confidencialidad total, se implementan varios mecanismos para aislar los componentes y evitar ataques de intermediario . Las implementaciones predeterminadas aseguran que intentar registrar un procedimiento ya registrado resultará en un error.
Los enrutadores pueden definir dominios administrativos, y los clientes deben especificar a qué dominio desean unirse al conectarse. Una vez unidos, el dominio actuará como un espacio de nombres , impidiendo que los clientes conectados a él utilicen identificadores definidos en otro para RPC y PubSub. Los dominios también tienen permisos asociados y pueden limitar a los clientes a un subconjunto de las acciones REGISTER/CALL/PubSub disponibles.
A algunos dominios solo pueden acceder clientes autenticados, utilizando diversos métodos de autenticación, como certificados TLS , cookies o un simple ticket.
RPC enrutadas
A diferencia de las llamadas RPC tradicionales, que se dirigen directamente desde el emisor a la entidad que ofrece el procedimiento (normalmente un servidor backend) y son estrictamente unidireccionales (de cliente a servidor), las llamadas RPC en WAMP son enrutadas por un middleware y funcionan bidireccionalmente.
El registro de las llamadas a procedimiento remoto (RPC) se realiza en el enrutador WAMP, y las llamadas a los procedimientos se emiten de forma similar a este enrutador. Esto significa, en primer lugar, que un cliente puede emitir todas las RPC a través de una única conexión con el enrutador WAMP, sin necesidad de saber qué cliente está ofreciendo el procedimiento, dónde se encuentra ni cómo acceder a él. De hecho, esta situación puede variar entre llamadas, lo que abre la posibilidad de implementar funciones avanzadas como el balanceo de carga o la conmutación por error para las llamadas a procedimientos.
Además, esto significa que todos los clientes de WAMP son iguales, ya que pueden ofrecer procedimientos para realizar llamadas. Esto evita la distinción tradicional entre clientes y servidores backend, y permite arquitecturas donde los clientes del navegador llaman a procedimientos en otros clientes del navegador, con una API que se asemeja a la comunicación entre pares.
Sin embargo, incluso con arquitecturas de múltiples niveles, el enrutador sigue siendo un único punto de fallo. Por esta razón, algunas hojas de ruta de implementación de enrutadores incluyen funciones de agrupación. [ 12 ]
Implementaciones
Clientela
Dado que los principales objetivos de WAMP son las aplicaciones web y el Internet de las cosas, las primeras implementaciones de clientes están en lenguajes bien establecidos en estas industrias (solo se incluyen clientes WAMP v2):
Los requisitos mínimos para crear un cliente WAMP son la capacidad de usar sockets y serializar a JSON. Por lo tanto, muchos lenguajes modernos ya cumplen con estos requisitos gracias a su biblioteca estándar. Las funciones adicionales que generarían dependencias, como el cifrado TLS o la serialización MessagePack, son opcionales.
Sin embargo, la naturaleza persistente de las conexiones WebSocket requiere el uso de bibliotecas no bloqueantes y API asíncronas . En lenguajes con un mecanismo oficial, como JavaScript, Erlang o Go, esto no representa un problema. Pero para lenguajes con varias soluciones competitivas para la programación asíncrona, como Python o PHP, obliga al desarrollador del cliente a comprometerse con una parte específica del ecosistema.
Por la misma razón, la integración de proyectos heredados también puede requerir trabajo. Por ejemplo, la mayoría de los frameworks web de Python más populares utilizan WSGI , una API síncrona, y ejecutar un cliente WAMP dentro de un proceso WSGI requiere adaptadores manuales como crochet.
Enrutadores
Aunque técnicamente los enrutadores pueden integrarse directamente en el código de la aplicación y algunas bibliotecas cliente también proporcionan un enrutador, esta arquitectura no es recomendable según la especificación. [ 13 ]
Dado que el enrutador es una pieza móvil, lo mejor es utilizarlo como una caja negra intercambiable, al igual que se consideraría Apache o Nginx para HTTP :
Tavendo , la empresa que originó el protocolo, también es la autora de Crossbar.io , que se promociona como la implementación de enrutador de facto. [ 14 ] Dado que promueven arquitecturas basadas en microservicios, Crossbar.io incorpora un administrador de servicios para alojar y monitorear componentes de aplicaciones WAMP, un servidor web de archivos estáticos y un contenedor WSGI. Al estar escrito con la biblioteca Twisted , es una de las implementaciones que se pueden configurar en producción sin un proxy, con el objetivo de reemplazar pilas como Nginx asociadas con Supervisor y Gunicorn .
Casos de uso
Al ser un subprotocolo de WebSocket, WAMP se adapta naturalmente a cualquier lugar donde se usarían WebSockets sin procesar, como una forma de sincronizar clientes como navegadores web, enviarles notificaciones push y permitir la colaboración en tiempo real suave entre usuarios. [ 15 ] También tiene las mismas limitaciones, requiriendo soporte del cliente, que falta para las versiones de Internet Explorer anteriores a la 10. [ 16 ] Esto se mitiga con la existencia de polyfills [ 17 ] que utilizan tecnologías más portátiles como Flash o el uso de HTTP Longpoll como alternativa. En ese sentido, WAMP es un competidor de DDP de Meteor .
WAMP también está dirigido al IoT, donde se utiliza de la misma manera que MQTT [ 18 ] como un medio ligero y eficiente para orquestar clústeres de objetos conectados. Las implementaciones en varios lenguajes lo hacen adecuado para controlar y monitorizar dispositivos pequeños como la Raspberry Pi (en Python) o el Tessel [ 19 ] (en JavaScript).
Por último, pero no por ello menos importante, WAMP puede funcionar como un bus de servicios empresariales, sirviendo de enlace entre microservicios como se haría con CORBA , ZeroMQ , Apache Thrift , SOAP o AMQP .
Evolución
WAMP se encuentra actualmente en la versión 2 [ 20 ] , que introdujo RPC enrutado. Hasta el momento, todos los enrutadores son compatibles con la versión 2. Algunos clientes aún no han sido adaptados: Wamp.io, AutobahnAndroid y cljWAMP.
La versión 2 de la especificación se divide en dos partes: el perfil básico, que incluye el enrutador RPC y Pub/Sub, y el perfil avanzado, que incorpora niveles de confianza, coincidencia de patrones URI y listado de clientes. El perfil básico se considera estable y es el que implementan las bibliotecas actuales, mientras que el perfil avanzado aún está en desarrollo.
Comparación
El sitio web de WAMP afirma [ 21 ] los siguientes puntos de venta para la tecnología:
- PubSub nativo : admite publicación y suscripción de forma predeterminada (no se requiere ninguna extensión).
- RPC : admite llamadas a procedimientos remotos de forma nativa (no se requiere ninguna extensión).
- RPC enrutado : admite llamadas a procedimientos remotos enrutadas (no solo punto a punto).
- Nativo web : se ejecuta de forma nativa en la web (sin tunelización ni puenteo).
- Compatibilidad con diferentes lenguajes : funciona en y entre diferentes lenguajes de programación y entornos de ejecución.
- Estándar abierto : Es una especificación abierta y oficial implementada por diferentes proveedores.
Por otro lado, WAMP no intenta lograr algunos de los objetivos de otros protocolos:
- Paso de objetos completo como CORBA .
- Sincronización de datos como DDP.
- Comunicación entre pares como ZeroMQ .
- Transmisión multimedia como WebRTC .
- Transferencia de archivos grandes como HTTP.
Sin embargo, numerosos protocolos comparten algunas características con WAMP:
Cabe destacar que, si bien DDP utiliza el mecanismo Pub/Sub internamente para sincronizar conjuntos de datos, no expone las primitivas Pub/Sub. Además, se trata de una especificación abierta con varias implementaciones, pero no está registrada como estándar.
Referencias
- ↑ Página de listado de protocolos de IANA
- ↑ Especificaciones del perfil básico de WAMP
- ↑ "Con WAMP se pueden construir sistemas distribuidos a partir de componentes de aplicaciones que están débilmente acoplados y se comunican en tiempo real (flexible)" .
- ↑ Unas palabras sobre WAMP
- ↑ Bahga, Arshdeep; Madisetti, Vijay (9 de agosto de 2014). En este capítulo [ ... ] aprenderá sobre el Protocolo de mensajería de aplicaciones web [ ... ] que proporciona herramientas y servicios para el desarrollo de soluciones de IoT . ISBN 9780996025515.
- ↑ "Transporte de enrutador Crossbar.io" . Archivado del original el 12 de enero de 2015. Consultado el 12 de enero de 2015 .
- ↑ "WAMP puede ejecutarse sobre transportes Raw en lugar de WebSocket. Cada mensaje tiene como prefijo un uint32 (big endian) que proporciona la longitud (serializada) del siguiente mensaje WAMP" . GitHub .
- ↑ Serialización WAMP
- ↑ "El serializador predeterminado de Wampy es JSON, pero también admite msgpack como serializador, pero necesitas incluir msgpack.js como dependencia" .
- ↑ Diagrama de vista aérea del funcionamiento interno de WAMP
- ↑ "El transporte Long-Poll puede transmitir una sesión WAMP a través del antiguo HTTP 1.0/1.1. Esto se logra mediante el envío por parte del cliente de solicitudes HTTP/POST, una para enviar y otra para recibir" . GitHub .
- ↑ "Arquitectura de nodos de barra transversal" . Archivado del original el 12 de enero de 2015. Consultado el 20 de abril de 2015 .
- ↑ "Los corredores y distribuidores son responsables del enrutamiento genérico de llamadas y eventos y no ejecutan código de aplicación" . GitHub .
- ↑ "Crossbar.io es el nombre del enrutador con más funciones" . 26 de diciembre de 2014.
- ↑ WAMP y AngularJS
- ↑ "¿Puedo usar websockets ?" .
- ↑ Polyfills de Web Socket
- ↑ "Además, comparamos WAMP con otros subprotocolos WebSocket registrados (MBWS, SOAP y STOMP) en términos de las características relacionadas; y con otros protocolos potenciales (CoAP y MQTT), en términos de las implementaciones prácticas relacionadas" (PDF) . Archivado del original (PDF) el 13 de mayo de 2016. Consultado el 12 de enero de 2015 .
- ↑ Aplicación de alarma Tessel con Crossbar.io
- ↑ Menú de especificaciones de WAMP 2
- ↑ WAMP comparado
- ↑ Especificaciones DDP
- protocolos de la capa de aplicación
- JSON
- Llamada a procedimiento remoto
- formatos de serialización de datos
- Comunicación entre procesos
- Middleware orientado a mensajes
- Middleware
- Protocolos de Internet
- protocolos de red
- Estándares abiertos