WebSocket sin servidor con AWS Lambda y Fanout

WebSocket

WebSocket sin servidor (serverless) con AWS Lambda y Fanout

WebSocket – Los conceptos básicos para agregar datos en tiempo real a su backend serverless (sin servidor).


WebSocket

Serverless

Serverless es uno de los nombres erróneos más populares del mundo de los desarrolladores. Contrariamente a su nombre, la informática sin servidor de hecho utiliza servidores, pero la ventaja es que puede preocuparse menos por el mantenimiento, la escala y la configuración. Esto se debe a que sin servidor es un modelo de ejecución de computación en la nube en el que un proveedor de la nube gestiona dinámicamente la asignación de la máquina y los recursos computacionales. Básicamente, está implementando código en un entorno sin procesos, sistemas operativos, servidores o máquinas virtuales visibles. Desde una perspectiva de precios, normalmente se le cobra por la cantidad real de recursos consumidos y no por la capacidad precomprada.

Pros

  • Complejidad arquitectónica reducida
  • Empaquetado e implementación simplificados
  • Costo reducido para escalar
  • Elimina la necesidad de administradores del sistema
  • Funciona bien con arquitecturas de microservicios
  • Costos operativos reducidos
  • Normalmente se reduce el tiempo de comercialización con lanzamientos más rápidos

Contras

  • Problemas de rendimiento: normalmente una latencia más alta debido a cómo se asignan los recursos de viaje
  • Aseguramiento del proveedor (difícil de cambiar a un nuevo proveedor)
  • No es eficiente para aplicaciones de larga duración.
  • Problemas de tenencia múltiple en los que los proveedores de servicios pueden ejecutar software para varios clientes diferentes en el mismo servidor
  • Difícil de probar funciones localmente
  • Las diferentes implementaciones de FaaS proporcionan diferentes métodos para iniciar sesión en funciones

AWS Lambda

La versión sin servidor de Amazon viene en forma de AWS Lambda. AWS Lambda le permite ejecutar código sin aprovisionar ni administrar servidores, mientras que solo paga por su uso real. Con Lambda, puede ejecutar código para prácticamente cualquier tipo de aplicación o servicio de backend: Lambda ejecuta y escala automáticamente el código de su aplicación. Además, puede configurar su código para que se active automáticamente desde otros servicios de AWS o llamarlo directamente desde cualquier aplicación web o móvil.

Websocket

Un WebSocket proporciona una conexión de larga duración para intercambiar mensajes entre el cliente y el servidor. Los mensajes pueden fluir en cualquier dirección para la comunicación full-duplex. Un cliente crea una conexión de WebSocket a un servidor, utilizando una biblioteca de cliente de WebSocket. Las bibliotecas de WebSocket generalmente están disponibles en todos los idiomas y, por supuesto, los navegadores las admiten de forma nativa mediante el objeto JavaScript de WebSocket. La negociación de la conexión usa un intercambio similar a HTTP, y una negociación exitosa se indica con el código de estado 101. Después de que se envía la respuesta de negociación, la conexión permanece abierta para intercambiar tramas de mensaje en formato de cadena binario o Unicode. Los compañeros también pueden intercambiar fotogramas cercanos para realizar un cierre limpio.
Creación de Websockets de AWS IoT
Los backends de función como servicio, como AWS Lambda, no están diseñados para manejar conexiones de larga duración por sí mismos. Esto se debe a que las invocaciones de funciones deben ser de corta duración. Lambda está diseñado para integrarse con servicios como AWS IoT para manejar este tipo de conexiones. AWS IoT Core admite MQTT (ya sea de forma nativa o mediante WebSockets), un protocolo de comunicación ligero diseñado específicamente para tolerar conexiones intermitentes.

WebSocket

Sin embargo, este enfoque por sí solo no le dará acceso a los elementos del protocolo sin procesar y no le permitirá crear una API pura basada en Lambda (si ese es su caso de uso previsto). Si desea este acceso, debe adoptar un enfoque diferente.

Creación de WebSockets con tecnología Lambda con Fanout

También puede crear WebSockets personalizados con tecnología Lambda integrando un servicio como Fanout, un cruce entre un agente de mensajes y un proxy inverso que permite la inserción de datos en tiempo real para aplicaciones y API. Con estos servicios juntos, podemos crear una API con tecnología Lambda que admita WebSockets sin formato.

Este enfoque utiliza GRIP, el Protocolo intermedio genérico en tiempo real, lo que hace posible que un servicio web delegue el comportamiento de inserción en tiempo real a un componente proxy.

Esta biblioteca FaaS GRIP facilita la delegación de la administración de conexiones de larga duración a Fanout, de modo que las funciones de backend solo deben invocarse cuando hay actividad de conexión. El otro beneficio es que las funciones de backend no tienen que ejecutarse durante la duración de cada conexión.

El siguiente desglose paso a paso está destinado a ser una referencia de configuración rápida. Puede consultar las bibliotecas de Github para las integraciones de Node y Python.

1. Configuración inicial

Primero configurará su dominio / entorno de Fanout Cloud y configurará una API y un recurso en AWS API Gateway para apuntar a su función de Lambda, mediante una integración de proxy de Lambda.

2. Usando Websockets

Siempre que se realice una solicitud HTTP o una conexión WebSocket a su dominio de Fanout Cloud, su función Lambda podrá controlarla. Para hacer esto, Fanout convierte la actividad de conexión entrante de WebSocket en una serie de solicitudes HTTP a su backend.

3. Tienes tiempo real

¡Ahora tiene WebSockets en tiempo real impulsados ​​por una función Lambda!

Un ejemplo

Este código de Node.js implementa un servicio de eco de WebSocket. Recomiendo consultar la biblioteca completa de FaaS GRIP para obtener un desglose paso a paso y obtener instrucciones sobre cómo implementar el sondeo largo HTTP y la transmisión HTTP.

var grip = require('grip');
var faas_grip = require('faas-grip');

exports.handler = function (event, context, callback) {
    var ws;
    try {
        ws = faas_grip.lambdaGetWebSocket(event);
    } catch (err) {
        callback(null, {
            statusCode: 400,
            headers: {'Content-Type': 'text/plain'},
            body: 'Not a WebSocket-over-HTTP request\n'
        });
        return;
    }

    // if this is a new connection, accept it
    if (ws.isOpening()) {
        ws.accept();
    }

    // here we loop over any messages
    while (ws.canRecv()) {
        var message = ws.recv();

        // if return value is null, then the connection is closed
        if (message == null) {
            ws.close();
            break;
        }

        // echo the message
        ws.send(message);
    }

    callback(null, ws.toResponse());
};

En general, si no busca un control total sobre los elementos de su protocolo sin procesar, puede que le resulte más fácil probar una configuración de Lambda / AWS IoT. Si necesita más visibilidad y control de WebSocket, la integración de Lambda + Fanout es probablemente su mejor opción.