是否可以使用 AWS 以无服务器方式订阅 WebSocket?

Posted

技术标签:

【中文标题】是否可以使用 AWS 以无服务器方式订阅 WebSocket?【英文标题】:Is it possible to subscribe to a WebSocket in a serverless fashion using AWS? 【发布时间】:2017-12-13 04:53:51 【问题描述】:

网站提供了一个 websocket 来获取实时数据。我正在尝试在 DynamoDB 表中记录从 websocket 接收到的数据,以作为无服务器应用程序的数据源。他们如何使用 websocket 的示例是一些使用 socket.io-client 的 Node.JS 代码。作为 javascript,我想使用 AWS Lambda 函数,但它们并不是为了持续运行。是否有 AWS 服务来处理此类订阅?我不想为了这个目的而制作一个小的 EC2 实例来运行一个小应用程序。

我看过的东西:

Lambda 函数 - 仅适用于短期执行而非长时间运行的任务。 SNS 订阅 - 据我了解,这需要订阅 SNS 发布者。 Kinesis Stream - 要求生产者使用 Streams PUT API。

任何帮助将不胜感激!

【问题讨论】:

似乎 serverless 的整个概念与维护 webSocket 与客户端连接的长期运行、有状态的服务器进程相反。 感谢您的回复。我正在寻找一种服务,它是接收从 websocket 推出的新数据的客户端。希望在无服务器框架中实现这似乎是一件合理的事情。 运气好了吗? 我也在寻找类似的东西,你有什么有用的吗? 【参考方案1】:

你们看不出来他不想做服务器,而是做客户端吗?

所以,如果我们要成为客户端,那么到目前为止,在 Amazon AWS 上还没有解决方案/服务,它是无服务器的,并且仅在套接字的生存时间内(从连接到断开连接)保持活动状态。

不幸的是,我认为我们只能为这种场景使用实例。

【讨论】:

只有这个答案有意义,我怀疑所有其他答案都是由机器人发布的【参考方案2】:

API Gateway 现在支持 WebSocket,您可以在其中处理 Lambda 中的事件并以简化的方式响应。更多信息请参考Announcing WebSocket APIs in Amazon API Gateway

您还可以使用 AWS 中的其他两项服​​务来实现此目的,

AWS IOT Websockets:- 这个想法是客户将订阅 IOT 主题,然后从 Lambda 将消息推送到客户端。

AWS AppSync(新引入):- 在 Lambda 和 DynamoDB 之间有一个层,它将提供 WebSocket 支持。

注意:您目前可能需要申请 AppSync 的预览版。

【讨论】:

有没有实现物联网websocket的例子?我只想订阅一个数据流并将接收到的数据存储在 S3 中。我在 AWS 文档中没有找到任何有用的示例 值得注意的是,AWS 现在已经在 API Gateway 中发布了对 WebSockets 的支持 - 请参阅 aws.amazon.com/blogs/compute/… 这不再是真的,投反对票。 @WarrenParad 感谢您的通知。相应地修改了答案。【参考方案3】:

API Gateway 直接支持 websockets。因此,您可以将 APIGW websocket api 连接到 lambda 函数并将其连接到 DynamoDB。

提供setting up websockets in APIGW 的详细分步指南。

一个示例设置可能是:

# 1. Create API Gateway Websocket
# 2. Create integration
aws apigatewayv2 create-integration 
  --api-id APIGW_ID --integration-type AWS_PROXY 
  --integration-method POST
  --integration-uri arn:aws:apigateway:REGION:lambda:path/2015-03-31/functions/LAMBDA_ARN/invocations

【讨论】:

以上是关于是否可以使用 AWS 以无服务器方式订阅 WebSocket?的主要内容,如果未能解决你的问题,请参考以下文章

AWS 云中带有订阅的 Apollo GraphQL 服务器

AWS AppSync 中订阅的自定义筛选

为啥标准库不以无锁方式为 8 字节以下的结构实现 std::atomic?

Android - 以无代码方式集成您的库以显示视图

以无点的方式映射seq中值的值

用于 AWS AppSync 中的异步计算的 Graphql 订阅