是否可以将Socket.io与AWS Lambda一起使用?

时间:2015-11-25 21:21:00

标签: ios sockets amazon-web-services socket.io aws-lambda

是否可以在AWS Lambda中构建一个创建websocket并将数据发送到订阅应用程序的函数?

这样的事情:

John在手机中打开了应用程序SuperPhotoApp,但决定使用桌面浏览器将照片上传到SuperPhotoApp服务(S3 Bucket),此事件执行Lambda函数,创建socket.io服务器并推送更新对于所有订阅者,他的手机已打开应用程序,因此应用程序会自动使用新照片进行更新。

这可以通过推送通知或Amazon SNS完成,但如果我需要实时行为,例如我需要更新角色位置的在线游戏,该怎么办。

如果Lambda无法做到这一点,是否有任何解决方案可以使用桌面浏览器更新我打开的应用程序?

Amazon EC2是唯一的选择吗?我已经读过它有缩放问题,这就是我在评论Lambda的原因。

8 个答案:

答案 0 :(得分:45)

Recently AWS released support of WebSockets for IoT service. It is very easy to use as Pub/Sub message system for serverless web applications. You can post new messages from AWS lambda function via http post request and receive them as websocket messages on a client.

I wrote a small npm package that handles websocket connection to MQTT server from the front-end app. Check out aws-mqtt-client

答案 1 :(得分:29)

我认为Lambda不会适用于您在此处描述的情况。下面的AWS论坛链接指出Lambda函数最多只能运行15分钟,而且由于每100毫秒的函数运行时收费,这可能会成本过高。亚马逊有评论说他们已经多次听过这个请求,所以有兴趣以某种方式允许这个。

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

以下是使用EC2和NodeJS似乎取得了很大成功的人的帖子,但他不得不使用Socket.io的替代方案,称为Websockets / ws。

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

如果您打算在负载均衡器后面运行服务器,看起来您还需要更多的环节来跳过:

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

答案 2 :(得分:18)

不! Lambda 专为socket.io设计。 Lambda仅用于短时间处理。

如果您想提供便宜的通知,可以尝试PubNubRealtime Framework等外部服务。

如果您只想继续使用亚马逊服务,请不要尝试SNS,因为它不会为此用例服务(浏览器没有端点)。

但是,您可以尝试AWS IoT。我知道这听起来很奇怪,但由于它通过MQTT支持浏览器,因此它是一种便宜,快速且易于开发通知的绝佳工具。按照this链接获取精彩教程。演示代码可用here

答案 3 :(得分:17)

更新(自AWS re:invent 2018):API Gateway现在支持websockets!请参阅此处使用带有Lambda的API Gateway websockets的示例:

以及此处API网关功能的文档:https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-websocket-api.html

还有一个有趣的Node.js框架示例,它使用带有API网关的socket.io,但我没有调查它是否特别适用于您的用例:https://github.com/tiaod/moleculer-io

您应该考虑使用Amazon IoT Core。我会解释一下。

如果您有实时情况需要执行计算或利用实时流的分析,您需要考虑将流事件(实时反映状态变化)转移到平台专为快速,高可用性事件流而设计,例如像AWS Kinesis这样的Kafka实现。然后,您可以使用专为实时流分析设计的工具来使用事件流,例如Kinesis Analytics或Apache Spark或Apache Storm。

然后您可以使用AWS Lambda(可以通过Kinesis管道传输的事件触发)来使用流分析(以及可选的其他事件提供的数据)来推送更新到所有订阅者。如果您为每个用户创建“主题”,则可以通过Amazon IoT核心服务进行连接,从而实时向这些订阅者推送更新。该服务的设计使您没有可以拥有的主题数量的上限,因此它应该弹性扩展。

这是一个最佳实践“大数据”无服务器(只要你避免维护虚拟机,只使用无服务器/托管服务)解决问题的一个例子,它将更有弹性,更具成本效益,管理您自己的EC2实例,并且需要担心所有其他令人头疼的问题,包括负载平衡,可用性和复制以及服务器状态和幂等性以及扩展和浪费的资源以及部署管道和实例监控,这些都是易于维护和可扩展的,等等。

如果您使用Amazon IoT核心服务,您甚至可以通过MQTT上的Web套接字将事件直接推送到客户端浏览器(非常快速且轻量级),并且您可以直接将其与AWS Lambda集成。 这里有一个很棒的演示应用程序使用物联网核心:https://github.com/aws-samples/aws-iot-chat-example

就个人而言,我更喜欢这种方法更便宜,更容易维护,表现更好,让我晚上睡觉,并且允许我进行不间断的睡眠,没有噩梦。

答案 4 :(得分:2)

我认为您可以将AWS Lambda与其他PUB / SUB服务结合使用,例如PUBNUB https://www.pubnub.com/docs/pubnub-rest-api-documentation

  1. 前端/应用使用AWS Lambda动态创建和管理主题
  2. 前端/应用从AWS Lambda或DB获取主题信息
  3. 前端/应用加入相应的主题并直接向PUBNUB发送消息

答案 5 :(得分:1)

如果您正在寻找实时功能,我会转向Firebase实时数据库或Firestore。我使用得非常重,我不得不说他们太棒了。请在此处查看https://firebase.google.com

答案 6 :(得分:0)

是的,您可以使用AWS Lambda将事件作为socket.io客户端发布到socket.io服务器。

实施步骤:

  • 在本地创建节点应用,然后在项目文件夹中执行npm install socket.io-client --save。
  • 在index.js中实现处理程序代码。这是一个示例:

    exports.handler =异步(事件)=> {

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

    };

  • 创建文件夹的zip文件。

  • 在AWS Lambda中,选择上传.Zip文件
  • 确保文件上传后,文件结构看起来类似于:

项目
-node_modules
-index.json
-package-lock.json
-package.json

保存并测试。

答案 7 :(得分:-1)

您不能使用Lambda托管套接字服务器。但是您可以使用lambda将事件发送到外部socketio服务器