【问题标题】:Is it possible to use Socket.io with AWS Lambda?是否可以将 Socket.io 与 AWS Lambda 一起使用?
【发布时间】:2016-02-28 20:09:25
【问题描述】:

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

类似这样的:

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

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

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

Amazon EC2 是唯一的选择吗?我读到它在扩展方面存在问题,这就是我评论 Lambda 的原因。

【问题讨论】:

  • 您需要将 IoT Core 与 Lambda 结合使用。请在下面的答案中查看我的解释。
  • 请参阅我关于 API Gateway 为 WebSocket 提供的新支持的更新答案。

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


【解决方案1】:

最近AWS released support of WebSockets for IoT服务。它非常容易用作无服务器 Web 应用程序的 Pub/Sub 消息系统。您可以通过http post request 发布来自AWS lambda function 的新消息,并在客户端以websocket 消息的形式接收它们。

我编写了一个小型 npm 包,用于处理从前端应用程序到 MQTT 服务器的 websocket 连接。查看aws-mqtt-client

【讨论】:

    【解决方案2】:

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

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

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

    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

    【讨论】:

    • 最后一个链接坏了。我发现另一篇关于同一主题的博文 - medium.com/@Philmod/…
    • 由于 AWS IoT Core 服务,此答案现在不正确。请在下面查看我的答案。
    【解决方案3】:

    更新(自 AWS re:invent 2018 起):API Gateway 现在支持 websocket!在此处查看将 API Gateway websockets 与 Lambda 结合使用的示例:

    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 Core 服务连接,您可以实时向这些订阅者推送更新,特别是如果您为每个用户创建一个“主题”。该服务的设计使您对可以拥有的主题数量没有上限,因此它应该可以弹性扩展。

    这是解决问题的最佳实践“大数据”无服务器(只要您避免维护虚拟机并仅使用无服务器/托管服务)方法的示例,它将更具弹性和成本效益,易于维护和可扩展,而不是管理您自己的 EC2 实例,并且需要担心负载平衡、可用性和复制、服务器状态和幂等性、扩展和资源浪费以及部署管道和实例监控等所有额外的麻烦,等等等等。

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

    就我个人而言,我更喜欢成本更低、更易于维护、性能更好、让我在晚上能够入睡以及让我获得不间断没有噩梦的睡眠的方法。

    【讨论】:

      【解决方案4】:

      不! Lambda 不是为 socket.io 设计的。 Lambda 专为短时间处理而设计。

      编辑:API Gateway 现在支持WebSockets

      --
      旧答案:

      如果你想提供廉价的通知,你可以试试PubNubRealtime Framework等外部服务。

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

      不过,你可以试试AWS IoT。我知道这听起来很奇怪,但是因为它通过 MQTT 支持浏览器,所以它是一个便宜、快速和易于开发通知的好工具。按照this 链接获取精彩教程。演示代码可用here

      【讨论】:

        【解决方案5】:

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

        1. 前端/应用使用 AWS Lambda 动态创建和管理主题
        2. 前端/应用从 AWS Lambda 或 DB 获取主题信息
        3. 前端/app加入对应topic,直接发消息给PUBNUB

        【讨论】:

        • 还有其他人害怕点击那个链接吗?
        【解决方案6】:

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

        实施步骤:

        • 在本地创建node应用,在项目文件夹中执行npm install socket.io-client --save
        • index.js 中实现处理程序代码。这是一个例子:
        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!';
        };
        
        • 创建文件夹的 zip 文件。
        • 在 AWS Lambda 中,选择上传 .Zip 文件
        • 确保文件上传后文件结构类似于:

        项目

        • node_modules
        • index.json
        • package-lock.json
        • package.json

        保存并测试。

        【讨论】:

          【解决方案7】:

          如果您正在寻找实时功能,我会选择 Firebase 实时数据库或 Firestore。我都大量使用它们,我不得不说它们很棒。在这里查看https://firebase.google.com

          【讨论】:

            【解决方案8】:

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

            【讨论】:

              猜你喜欢
              • 2016-04-01
              • 1970-01-01
              • 2018-01-22
              • 2018-11-24
              • 2022-12-16
              • 1970-01-01
              • 2021-11-15
              • 1970-01-01
              • 2017-11-02
              相关资源
              最近更新 更多