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

Vla*_*lav 58 sockets amazon-web-services ios socket.io aws-lambda

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

像这样的东西:

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

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

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

亚马逊EC2是唯一的选择吗?我已经读过它有缩放问题,这就是为什么我在评论Lambda.

Dmi*_*rov 47

最近,AWS发布了针对物联网服务的WebSockets支持.它非常容易用作无服务器Web应用程序的Pub/Sub消息系统.您可以从AWS lambda functionvia 发布新消息,http post request并在客户端上将其作为websocket消息接收.

我写了一个小的npm包来处理来自前端应用程序的MQTT服务器的websocket连接.查看aws-mqtt-client


ken*_*gen 29

我不认为Lambda会为你描述的案例工作.以下AWS论坛的链接指出Lambda函数最多只能运行5分钟,而且由于每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


Zan*_*non 21

没有!Lambda 不是为socket.io设计的.Lambda仅用于短时处理.

如果您想提供廉价通知,可以尝试使用PubNubRealtime Framework等外部服务.

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

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


dev*_*ost 19

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

和网关的这个功能的文档在这里: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 Core服务,您甚至可以使用MQTT上的Web套接字将事件直接推送到客户端浏览器(这非常快速且轻量级),您可以直接将其与AWS Lambda集成.这里有一个很棒的演示应用程序使用物联网核心:https://github.com/aws-samples/aws-iot-chat-example

就个人而言,我更喜欢这种方法,它更便宜,更容易维护,性能更好,让我晚上睡觉,并且让我可以获得无噩梦的不间断睡眠.