在现代的应用程序开发中,实时消息传递系统已经成为了一个重要的组件。这种系统不仅可以支持即时通讯,还可以用于推送通知、协作、游戏等场景。而使用 Serverless 平台来构建实时消息传递系统则具有许多优点:无需管理服务器、按需付费、伸缩性好等。下面介绍使用 AWS Lambda 和 AWS API Gateway 来构建实时消息传递系统的方法。
架构
先来看一下整个系统的架构:
这个架构包含了以下几个组件:
- WebSocket API:使用 AWS API Gateway 的 WebSocket 功能来实现 WebSocket API。
- Lambda 函数:当 WebSocket API 收到消息时,使用 Lambda 函数来处理消息。
- DynamoDB:用于存储 WebSocket 连接和用户的绑定关系。
WebSocket API
首先需要创建一个 WebSocket API。在 AWS API Gateway 中,可以通过以下步骤来创建 WebSocket API。
- 登录 AWS 控制台,在 API Gateway 控制台中选择“Create API”。
- 选择 WebSocket API,并指定 API 名称和描述,然后单击“Create API”。
现在已经创建了一个空的 WebSocket API,接下来需要添加一个 WebSocket 路径和一个 Lambda 集成。
- 在 WebSocket API 中选择 “Routes”,然后单击 “Create Route”。创建一个 WebSocket 路径,例如 "/message"。
- 在 WebSocket 路径中选择“Create Integration”,然后选择“Lambda Function”作为集成类型。
- 在 “Configure Lambda” 页面,输入 Lambda 函数的名称,以及选择 “Use Lambda Proxy integration” 选项。
- 在完成全局参数后,单击 “Create” 完成 WebSocket API 的部署。
现在已经有了一个可用的 WebSocket API,但是需要添加一些 WebSocket 具体功能的参数。在 “Routes” 下找到 WebSocket 路径下的 “Route Request” ,并添加以下参数:
$request.body
:定义 WebSocket 消息体。默认是没有消息体的空字符串。$context.connectionId
:定义 WebSocket 连接标识。与每个客户端建立 WebSocket 连接时生成的“connectionId”相对应。
Lambda 函数
在“Integration Request” 配置时,需要绑定一个 Lambda 函数,它用于接收并处理 WebSocket 消息。这个 Lambda 函数需要完成以下工作:
- 解析传入的 WebSocket 消息,可以是 JSON 或其他消息格式。
- 确定要向哪些用户发送消息。
- 将消息发送到指定的客户端。
下面是一个简单的 Node.js Lambda 实现 WebSocket 消息的发布和订阅。
-- -------------------- ---- ------- ----- --- - ------------------- ----- -------- - --- ------------------------------ --------------- - ----- ------- -------- -- - ----- ----------- - ----------------------- ----- -------- -------- - ------------ ----- ----------- - ----- ------------------------- ----------------------------------- ----- --------- - --------------------------- ---------------- -- - --- - ----- ----------------------------- ---------- - ----- --- - --------------- - --- ----- ----------------------- -- ----- -------- ----------------------------- --------- - ----- ------------------ - --- ----------------------------- --------- --------------------------------- --- --- - ----- ------------------------------------- ------------- ------------- ----- -------- ------------- - ----- --- - -- ------------- --- ---- - ----- ----------------- ---------- ----------------------- ---- --------------- ------------- - ---- ----- -- - -
该 Lambda 函数使用 DynamoDB 存储 WebSocket 连接 ID,并扫描 DynamoDB 表查找活动连接。然后,Lambda 函数将消息发送到所有搜索到的连接。
DynamoDB
在 Lambda 函数中使用 DynamoDB 存储 WebSocket 连接 ID。连接 ID 是由 AWS API Gateway 中 WebSocket API 生成并提供的。
DynamoDB 表需要包含以下项目:
id
:每个 WebSocket ConnectionID 的唯一标识符。roomId
:标识此连接的房间 ID。
可以使用以下代码片段来存储 WebSocket 连接 ID(此示例使用 AWS SDK for JavaScript SDK for Node.js
):
-- -------------------- ---- ------- ----- --- - ------------------- ----- -------- - --- ------------------------------ ----- -------- ---------------------------- -------- - ----- -------------- ---------- ----------------------- ----- - --- ------------- ------- -- ------------- -
可以使用以下代码片段来删除连接 ID:
-- -------------------- ---- ------- ----- --- - ------------------- ----- --- - --- ------------------------------ ----- -------- -------------------------------- - ----- ------------ ---------- ----------------------- ---- - --- ------------- -- ------------- -
总结
本文介绍了使用 Serverless 架构来构建实时消息传递系统的方法。其中,使用 AWS Lambda 和 AWS API Gateway 来创建 WebSocket API,并使用 DynamoDB 来存储 WebSocket 连接和用户的绑定关系。这种 Serverless 架构不仅可以提供良好的伸缩性和可靠性,而且不需要您来管理服务器,只需要按需付费即可。希望本文对您有所帮助,如有疑问,请在评论区留言。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/649fb53548841e9894c11660