web-dev-qa-db-fra.com

Est-il possible d'utiliser Socket.io avec AWS Lambda?

Est-il possible de créer une fonction dans AWS Lambda qui crée un websocket et envoie des données aux applications souscrites?

Quelque chose comme ça:

John a l'application SuperPhotoApp ouverte dans son téléphone mais décide d'utiliser le navigateur du bureau pour télécharger une photo sur le service SuperPhotoApp (un seau S3). Cet événement exécute une fonction Lambda qui crée un serveur socket.io et envoie la mise à jour à tous les abonnés. , son téléphone avait l’application ouverte pour que celle-ci soit automatiquement mise à jour avec la nouvelle photo.

C’est quelque chose qui peut être fait avec les notifications Push ou Amazon SNS, mais si j’ai besoin d’un comportement en temps réel, par exemple un jeu en ligne où je dois mettre à jour la position d’un personnage.

Si cela n’est pas possible avec Lambda, existe-t-il une solution permettant de mettre à jour mon application ouverte à l’aide d’un navigateur Web?

Amazon EC2 est la seule option? J'ai lu qu'il y avait des problèmes de mise à l'échelle, c'est pourquoi je commente Lambda.

51
Vladislav

Je ne pense pas que Lambda va travailler pour le cas que vous décrivez. Le lien vers le forum AWS ci-dessous indique que la fonction Lambda ne peut s'exécuter que pendant 5 minutes au maximum. En outre, étant donné que vous êtes facturé pour 100 ms d'exécution, cela coûterait probablement très cher. Un commentaire d'Amazon a déclaré avoir entendu la demande à plusieurs reprises et est donc intéressé par un moyen de permettre cela.

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

Voici un message de quelqu'un qui semble avoir beaucoup de succès avec EC2 et NodeJS mais qui devait utiliser une alternative à Socket.io appelée Websockets/ws. 

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

Si vous envisagez de faire fonctionner votre serveur derrière un équilibreur de charge, il semble que vous ayez encore quelques obstacles à franchir:

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

27
kennbrodhagen

Récemment AWS a pris en charge WebSockets pour IoT service. Il est très facile à utiliser comme système de messagerie Pub/Sub pour les applications Web sans serveur. Vous pouvez publier de nouveaux messages à partir de AWS lambda function via http post request et les recevoir en tant que messages Websocket sur un client.

J'ai écrit un petit paquet npm qui gère la connexion websocket au serveur MQTT à partir de l'application frontale. Découvrez aws-mqtt-client

44
Dmitriy Nevzorov

Non! Lambda était not conçu pour socket.io. Lambda a été conçu pour le traitement à court terme uniquement.

Si vous souhaitez fournir des notifications peu coûteuses, vous pouvez essayer des services externes tels que PubNub ou Realtime Framework .

Si vous souhaitez continuer à utiliser uniquement les services Amazon, n'essayez pas d'essayer SNS , car cela ne servirait pas ce cas d'utilisation (il n'y a pas de point final pour les navigateurs). 

Cependant, vous pouvez essayer AWS IoT . Je sais que cela semble étrange, mais puisqu'il prend en charge les navigateurs via MQTT, c'est un excellent outil pour développer des notifications bon marché, rapides et faciles. Suivez this link pour un excellent tutoriel. Le code de démonstration est disponible ici .

18
Zanon

Mise à jour (depuis AWS re: invent 2018): API Gateway prend désormais en charge les websockets! Voir des exemples d'utilisation de serveurs Web API Gateway avec Lambda ici: 

et la documentation relative à cette fonctionnalité d’API Gateway ici: https://docs.aws.Amazon.com/apigateway/latest/developerguide/apigateway-websocket-api.html

Il existe également un exemple intéressant d'infrastructure Node.js qui utilise socket.io avec API Gateway, mais je n'ai pas cherché à savoir si cela fonctionnerait spécifiquement pour votre cas d'utilisation: https://github.com/tiaod/moleculer- io


Vous devriez envisager d'utiliser Amazon IoT Core. Je vais t'expliquer. 

Si vous vous trouvez dans une situation en temps réel où vous devez effectuer un calcul ou exploiter des analyses sur un flux en temps réel, vous devez penser à la diffusion en continu d'événements (reflétant les changements d'état en temps réel) vers une plate-forme conçue pour la transmission rapide. , la diffusion d'événements à haute disponibilité, telle qu'une implémentation de Kafka telle qu'AWS Kinesis. Vous pouvez ensuite utiliser le flux d'événements à partir d'un outil conçu pour l'analyse en temps réel, tel que Kinesis Analytics, Apache Spark ou Apache Storm.

Ensuite, vous pouvez utiliser les analyses en continu (et éventuellement d'autres données fournies par un événement) à l'aide d'AWS Lambda (qui peut être déclenché par des événements provenant de votre pipeline Kinesis) pour envoyer les mises à jour à tous les abonnés. Vous pouvez envoyer des mises à jour en temps réel à ces abonnés s'ils sont connectés via le service Amazon IoT Core spécifiquement si vous créez une "rubrique" pour chaque utilisateur. Le service est conçu de manière à ne pas limiter le nombre de sujets que vous pouvez avoir, il doit donc évoluer de manière élastique. 

Ceci est un exemple d’approche sans serveur «Big Data» conforme aux meilleures pratiques (pour autant que vous évitiez de conserver les VM et que vous utilisiez uniquement des services sans serveur/gérés), et que ce sera beaucoup plus élastique, rentable, facile à utiliser. maintenez et évolutif que de gérer vos propres instances EC2 et de vous inquiéter de tous les problèmes supplémentaires liés à l'équilibrage de charge, à la disponibilité, à la réplication, à l'état de serveur et à l'idempotency, à la mise à l'échelle et au gaspillage de ressources ainsi qu'au pipeline de déploiement et à la surveillance d'instance, etc. etc.. 

Vous pouvez même envoyer des événements directement au navigateur client avec des sockets Web sur MQTT (ce qui est très rapide et léger) si vous utilisez le service Amazon IoT Core et vous pouvez l'intégrer directement à AWS Lambda. Il existe une excellente application de démonstration utilisant IoT Core ici: https://github.com/aws-samples/aws-iot-chat-example

Personnellement, je préfère une approche moins coûteuse, plus facile à maintenir, plus performante, qui me permet de dormir la nuit et de dormir sans interruption sans cauchemars. 

14
devinbost

Je pense que vous pouvez combiner AWS Lambda avec d’autres services PUB/SUB, tels que PUBNUB https://www.pubnub.com/docs/pubnub-rest-api-documentation .

  1. front-end/app utilise AWS Lambda pour créer et gérer de manière dynamique des sujets
  2. front-end/app obtient les informations de sujet d'AWS Lambda ou de la base de données
  3. front-end/app rejoindre les sujets correspondants et envoyer un message à PUBNUB directement
2
Stupidism

Si vous recherchez une fonctionnalité en temps réel, je me tournerais vers la base de données Firebase Real Time ou Firestore. J'utilise les deux très fréquemment et je dois dire qu'ils sont extraordinaires. Découvrez-le ici https://firebase.google.com

1
DevShadow

Oui, vous pouvez publier des événements en tant que client socket.io sur un serveur socket.io à l'aide de AWS Lambda.

Étapes à suivre pour mettre en œuvre:

  • Créez une application de noeud localement et exécutez npm install socket.io-client --save dans le dossier du projet.
  • Implémentez le code du gestionnaire dans index.js. Voici un exemple:

    exports.handler = async (event) => {

    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!';
    

    };

  • Créez un fichier Zip du dossier.

  • Dans AWS Lambda, sélectionnez Télécharger un fichier .Zip.
  • Assurez-vous qu'après la mise en ligne des fichiers, la structure de fichier ressemble à:

Projet
- node_modules
- index.json
- package-lock.json
- package.json

Enregistrez et testez.

0
Pharmakon