AWS 上的无服务器 WebSocket
服务或人之间的实时通信很难实现。
值得庆幸的是,在云计算时代,我们有多个选项可以用来实现可靠的基于 WebSocket 的通信。
在这篇博文中,我将在 AWS 的背景下讨论WebSockets。有哪些选择?它们各自的优缺点是什么?每种方案可以部署在什么样的架构上?
让我们来一探究竟。
Amazon API Gateway WebSockets
2018 年 12 月,AWS 宣布了 Amazon API Gateway 的一项新功能——WebSockets支持。
我记得当时对这个新增功能非常兴奋。由于我学习新编程语言的首选是聊天应用程序(我觉得TODO风格的应用程序有点无聊),所以我立即翻阅了服务文档以了解更多信息。
缺点
阅读完文档后,我的热情很快就消退了。
-
对广播行为的支持非常不理想。据我所知,目前还没有办法通过一次 API 调用原生地向多个连接发送消息。由于缺乏对主题或房间的原生支持,Amazon API Gateway WebSockets在需要广播功能时,并不是一个理想的选择。
-
需要以某种方式跟踪各个连接的状态。根据我的经验,开发人员通常倾向于使用Amazon DynamoDB来实现这一点。如果您正在寻找一个完全托管的解决方案,那么您可能会有点失望。
优点
但事情并不全是坏事。
-
由于您很可能已经利用了Amazon API Gateway ,因此将WebSockets添加到您的架构的复杂性大大降低。
-
借助Amazon API Gateway 的直接集成功能,无需AWS Lambda函数,即可创建复杂且高弹性的WebSocket后端。 我亲自接受了这个挑战。结果如下。
-
该功能的活动部件相对较少,而且在我看来,非常容易上手,而且学习起来非常有趣。
架构
我认为Amazon API Gateway 的 WebSockets是池化的绝佳替代方案。根据您服务的流量,维护WebSocket连接可能比定期向 API 发送请求更经济。这里有一个关于这个主题的优秀资源。
AWS AppSync GraphQL 订阅
AWS AppSync是一项支持您创建托管GraphQL API 的服务。随着GraphQL进入工程主流,这项服务也迅速受到欢迎
实时功能通过GraphQL 订阅公开。由于解释GraphQL 订阅超出了本文的范围,如果您不熟悉该术语,我建议您自行进行一些探索。
缺点
-
依我拙见,在实施过程中你可能会遇到很多陷阱。这里有一篇很棒的文章,探讨了这个问题。
-
在前端,您可能会在将AWS AppSync JavaScript 客户端与您的某个GraphQL客户端库集成时遇到问题。截至撰写本文时,GitHub 上有很多与我最喜欢的 GraphQL 客户端apollo-client集成相关的问题。
-
这一点现在可能已经很明显了,但我还是想提一下。据我所知,该功能仅在GraphQL环境中可用。如果能有一个非 GraphQL专用的AWS AppSync 订阅版本就太好了。另一方面,也许这样的服务已经存在?继续阅读,了解更多!
优点
-
我的天哪, AWS AppSync真的能帮你完成很多事情。如果一切顺利,这项服务能帮你节省很多时间。依我拙见,它的基础知识很容易掌握,如果你已经熟悉GraphQL,那么应该很容易掌握AppSync 订阅的工作原理。
-
AWS AppSync订阅的扩展性非常好。根据 AWS 的说法,扩展到数百万个连接应该没有问题。以我的经验来说,我能够将该服务扩展到大约 50 万个连接,没有任何问题。
架构
说到AWS AppSync ,选择太多了。这项服务几乎可以完美适配所有需要GraphQL 订阅的情况。
我的建议是熟悉服务页面的AWS AppSync用例部分。
AWS IoT Core MQTT
当我第一次听说AWS IoT服务套件时,我最先想到的就是它对WebSockets的丰富且可扩展的支持。深入了解之后,我惊喜地发现该服务公开了完全托管的MQTT主题。
缺点
-
要全面理解WebSocket 的功能,需要熟悉许多特定于服务的活动部件。什么是设备影子?我需要某种证书来进行身份验证吗?什么是数据端点?这些都是我在尝试弄清楚该服务如何工作时问过自己的一些问题。
-
或许是因为我自己比较封闭,所以没看到太多关于如何使用AWS IoT Core实现WebSocket 的教学资料。你可能会觉得很难找到问题的答案。以下是我在试用这项服务时参考的博客文章。
优点
- 通过AWS IoT Core MQTT实现的WebSocket独立于 API 架构。您是否正在使用自己的GraphQL服务器?或者您更喜欢 REST API?无论哪种情况,都可以与IoT Core MQTT集成。还记得我之前提到过用于处理WebSocket 的非 GraphQL特定服务吗?这就是我之前提到的服务。
架构
任何与物联网相关的东西都不是我的专业领域。但这并没有阻止我进行实验。
我相信AWS IoT Core MQTT可以用于实时前端功能切换。借助AWS Amplify插件,将前端与服务集成应该会非常轻松。以下是我使用AWS IoT Core构建实时前端功能切换的尝试。
结束语
当谈到AWS 上的无服务器WebSockets时,开发人员有很多选择——从GraphQL特定服务到令人惊讶的AWS IoT Core MQTT主题的使用。
希望您阅读本文后能有所收获。我旨在提供每项服务的基本信息,并鼓励您自行进一步探索。
如果您有任何疑问,请随时在 Twitter 上给我发送 DM - @wm_matuszewski。
感谢您抽出时间。
文章来源:https://dev.to/aws-builders/serverless-websockets-on-aws-3nm9