ios sockets amazon-web-services socket.io aws-lambda

ios - ¿Es posible usar Socket.io con AWS Lambda?



sockets amazon-web-services (8)

Actualización (desde AWS re: invent 2018): ¡API Gateway ahora es compatible con websockets! Vea ejemplos que usan Websockets API Gateway con Lambda aquí:

y documentación para esta característica de API Gateway aquí: https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-websocket-api.html

También hay un ejemplo interesante de un marco Node.js que usa socket.io con API Gateway, pero no he investigado si funcionará específicamente para su caso de uso: https://github.com/tiaod/moleculer-io

Debería considerar usar Amazon IoT Core. Lo explicaré.

Si tiene una situación en tiempo real en la que necesita realizar un cálculo o aprovechar el análisis en una transmisión en tiempo real, debe estar pensando en eventos de transmisión (que reflejen los cambios de estado en tiempo real) en una plataforma diseñada para un rápido , transmisión de eventos de alta disponibilidad, como una implementación de Kafka como AWS Kinesis. Luego puede consumir el flujo de eventos desde una herramienta diseñada para análisis de transmisión en tiempo real, como Kinesis Analytics o Apache Spark o Apache Storm.

Luego puede consumir los análisis de transmisión (y opcionalmente también datos adicionales proporcionados por eventos) usando AWS Lambda (que puede ser activado por eventos que llegan a través de su canal de Kinesis) para enviar actualizaciones a todos los suscriptores. Puede enviar actualizaciones en tiempo real a estos suscriptores si está conectado a través del servicio Amazon IoT Core específicamente si crea un "tema" para cada usuario. El servicio está diseñado para que no tenga un límite superior en la cantidad de temas que puede tener, por lo que debe escalar elásticamente.

Este es un ejemplo de una mejor práctica de "big-data" sin servidor (siempre que evite mantener máquinas virtuales y solo use servicios sin servidor / administrados) para su problema, y ​​será mucho más elástico, rentable y fácil de usar. mantenimiento y escalabilidad que administrar sus propias instancias EC2 y tener que preocuparse por todos los dolores de cabeza adicionales con el equilibrio de carga y la disponibilidad y la replicación y el estado del servidor y la idempotencia y el escalado y los recursos desperdiciados y la canalización de implementación y la supervisión de instancias, etc. etc.

Incluso puede enviar eventos directamente al navegador del cliente con sockets web a través de MQTT (que es muy rápido y liviano) si usa el servicio Amazon IoT Core, y puede integrarlo directamente con AWS Lambda. Hay una gran aplicación de demostración que usa IoT Core aquí: https://github.com/aws-samples/aws-iot-chat-example

Personalmente, prefiero el enfoque que es menos costoso, más fácil de mantener, funciona mejor, me permite dormir por la noche y me permite dormir sin interrupciones y sin pesadillas.

¿Es posible construir una función en AWS Lambda que cree un websocket y envíe datos a las aplicaciones suscritas?

Algo como esto:

John tiene la aplicación SuperPhotoApp abierta en su teléfono, pero decide usar el navegador de escritorio para cargar una foto en el servicio SuperPhotoApp (un S3 Bucket), este evento ejecuta una función Lambda que crea un servidor socket.io y envía la actualización a todos los suscriptores , su teléfono tenía la aplicación abierta, por lo que la aplicación se actualiza automáticamente con la nueva foto.

Esto es algo que se puede hacer con notificaciones push o Amazon SNS, pero qué pasa si necesito un comportamiento en tiempo real, por ejemplo, un juego en línea donde necesito actualizar la posición de un personaje.

Si esto no es posible con Lambda, ¿hay alguna solución donde pueda actualizar mi aplicación abierta usando un navegador de escritorio?

Amazon EC2 es la única opción? He leído que tiene problemas con el escalado, por eso estoy comentando sobre Lambda.


Creo que puede combinar AWS Lambda con otro servicio PUB / SUB como PUBNUB https://www.pubnub.com/docs/pubnub-rest-api-documentation .

  1. el front-end / aplicación usa AWS Lambda para crear y administrar temas dinámicamente
  2. el front-end / app obtiene información del tema de AWS Lambda o DB
  3. el front-end / aplicación se une a los temas correspondientes y envía un mensaje a PUBNUB directamente

No creo que Lambda vaya a funcionar para el caso que describiste aquí. El enlace al foro de AWS a continuación señala que la función Lambda solo puede ejecutarse durante un máximo de 15 minutos y, además, dado que se le cobra por cada 100 ms de tiempo de ejecución de la función, esto probablemente sea un costo prohibitivo. Hay un comentario de Amazon que dice que han escuchado la solicitud varias veces, por lo que están interesados ​​de alguna manera para permitir esto.

https://forums.aws.amazon.com/thread.jspa?threadID=205761

Aquí hay una publicación de alguien que parece tener mucho éxito usando EC2 y NodeJS pero tuvo que usar una alternativa a Socket.io llamada Websockets / ws.

http://www.jayway.com/2015/04/13/600k-concurrent-websocket-connections-on-aws-using-node-js/

Si planea ejecutar su servidor detrás de un equilibrador de carga, parece que tendrá algunos aros más para saltar:

https://web.archive.org/web/20160118124227/http://coding-ceo.ghost.io/how-to-run-socket-io-behind-elb-on-aws


No puede usar Lambda para alojar un servidor socketio. Pero puede usar lambda para emitir eventos en un servidor socket externo


Recientemente AWS lanzó el soporte de WebSockets para el servicio IoT . Es muy fácil de usar como sistema de mensajes Pub / Sub para aplicaciones web sin servidor. Puede publicar mensajes nuevos desde la AWS lambda function través de http post request y recibirlos como mensajes websocket en un cliente.

Escribí un pequeño paquete npm que maneja la conexión websocket al servidor MQTT desde la aplicación front-end. Echa un vistazo a aws-mqtt-client


Sí, puede publicar eventos como cliente socket.io en un servidor socket.io con AWS Lambda.

Pasos para implementar:

  • Cree una aplicación de nodo localmente y ejecute npm install socket.io-client --save en la carpeta del proyecto.
  • Implemente el código del controlador en index.js. Aquí hay un ejemplo:

    exportaciones.handler = asíncrono (evento) => {

    var io = require(''socket.io-client''); var socket = io.connect("http://example.com:9999"); let payload = { "id": "1" }; socket.emit("MyEvent", payload); return ''Sent message!'';

    };

  • Crea un archivo zip de la carpeta.

  • En AWS Lambda, seleccione Cargar un archivo .Zip
  • Asegúrese de que después de cargar los archivos, la estructura del archivo sea similar a:

Proyecto
-nodo_módulos
-index.json
-package-lock.json
-package.json

Guardar y probar.


Si está buscando funcionalidad en tiempo real, recurriría a Firebase Real Time Database o Firestore. Utilizo ambos bastante y tengo que decir que son increíbles. Compruébalo aquí https://firebase.google.com


¡No! Lambda no fue diseñado para socket.io. Lambda fue diseñado solo para procesamiento a corto plazo.

Si desea proporcionar notificaciones baratas, puede probar servicios externos como PubNub o Realtime Framework .

Si desea seguir usando solo los servicios de Amazon, no se moleste en probar SNS porque no servirá para este caso de uso (no hay un punto final para los navegadores).

Sin embargo, puede probar AWS IoT . Sé que suena extraño, pero dado que admite navegadores a través de MQTT, es una gran herramienta para notificaciones baratas, rápidas y fáciles de desarrollar. Sigue this enlace para un gran tutorial. El código de demostración está disponible here .