前言
传统的应用架构中,我们需要自己搭建和维护服务器,同时考虑如何处理流量和负载均衡等问题。而 Serverless 架构则可以让我们将更多精力放在业务逻辑上,而不是在基础设施上。
Serverless 架构最常见的两个组件是消费队列和事件网关。本文将详细探讨如何利用它们来实现无服务架构,并提供示例代码作为指导。
消费队列的作用
当我们的应用需要处理大量请求时,我们不能直接将这些请求直接发送给应用。这样会使应用崩溃,因为它无法同时处理大量请求。
消费队列是一个缓冲区,我们可以将请求发送到该缓冲区中,然后按顺序一个接一个地处理它们。消费队列可以平稳地处理大量请求,因为每次只消费一个请求,并在处理期间处理其他请求。这也有助于我们的应用保持稳定和高效。
事件网关的作用
事件网关允许我们将应用的请求路由到不同的函数中。当请求到达事件网关时,它会检查请求的信息,并将其路由到适当的函数中。这允许我们将应用功能分解成更小的组件,每个组件都可以被独立调用。
例如,假设我们有一个数据库操作,我们可以将其拆分为三个部分:查询、修改和删除。通过事件网关实现,我们可以将每个操作单独实现为一个 AWS Lambda 函数,然后将每个函数与正确的 HTTP 端点关联起来。这意味着,每次对数据库进行操作时,我们都可以通过事件网关将请求发送到正确的函数中,而无需改动我们在应用程序中调用这个操作的方法。
实战思考
接下来我们将利用消费队列和事件网关来实现一个在 AWS Lambda 上运行的无服务器函数。我们的目标是将一个 JSON 对象发送到一个 API 端点,然后将其中的数据存储到 DynamoDB 数据库中。我们将按顺序完成以下步骤:
- 发送 JSON 对象到 API 端点
- 将数据发送到 SNS 主题
- 将 SNS 消息发送到 SQS 队列
- 从队列中读取数据
- 将数据存储到 DynamoDB 数据库中
为了演示这个过程,我们将使用 AWS Lambda、API Gateway、SNS、SQS 和 DynamoDB。以下是开始之前需要的准备工作:
- 在 AWS 上创建一个新的 IAM 用户,拥有访问 Lambda、API Gateway、SNS、SQS 和 DynamoDB 的权限。
- 为该用户创建安全凭据。
在示例代码部分,我们要使用 AWS SDK for JavaScript,所以确保安装了最新版本的 SDK。
示例代码
发送 JSON 对象到 API 端点
我们首先需要创建一个 API Gateway 端点,将 JSON 对象发送到该端点。
API Gateway 将 JSON 对象作为字符串处理,所以我们需要在 Lambda 函数内部将其解析为对象。以下代码显示如何使用 AWS SDK for JavaScript 创建 API Gateway 端点:
-- -------------------- ---- ------- ----- --- - ------------------- ----- ---------- - --- ---------------- ------- ----------- --- ----- ------------ - ----- -- -- - ----- - -- - - ----- -------------------------------------- ------ --- -- ----- ------------- - ----- -- -- - ----- - --- --------- - - ----- --------------------------------------- ----- - --- ---------- - - ----- --------------------------- ---------- --------- ---------- --------- ------ ------------- ----- ---------------------- ---------- ----------- ----------- ------- ------------------ ------ ------------- ----- --------------------------- ---------- ----------- ----------- ------- ----- ------ ------------- ----- ------------------------------ ---------- ----------- ----------- ------- ----------- ----- ------------- ----- ----------------------------------- ---------- ----------- ----------- ------- ----------- ------ ------------------ - ------------------- -- - ------------- ------ ---------- -- ----- ---------------- - ----- ----------- -- - ----- - -- - - ----- ----------------------------- ---------- ---------- ------- ------------- ------ --- --
接下来,我们将使用 AWS SDK for JavaScript 从 API Gateway 端点发送 JSON 对象到 Lambda 函数:
-- -------------------- ---- ------- ----- ---------- - --- ---------------- ------- ----------- --- ----- -------- - ----- ------ -- - ----- ------ - ----- --------------- ----- --------- - ----- ---------------- ----- ------------ - ----- ---------------------------- ----- - --- - - ----- ----------------------- --------- ------------- ----- -------- - ----- -------------------- - ------- ------- -------- - --------------- ------------------- ------------ ------ -- ----- --------------------- --- ------ ----- ---------------- --
将数据发送到 SNS 主题
接下来,我们需要将数据发送到 SNS 主题。SNS 用于将消息通知到需要它们的订阅者,这对于异步处理特别有用。
以下是如何将数据发送到 SNS 主题的示例代码:
-- -------------------- ---- ------- ----- --- - --- --------- ------- ----------- --- ----- -------------- - ----- ------------- -------- -- - ----- -------- - ----- ------------- -------- ------------------------ --------- ------------ ------------- ------ ------------------- --
将 SNS 消息发送到 SQS 队列
现在我们可以将消息发送到 SNS 主题。接下来,我们将创建一个 SQS 队列,并将 SNS 主题的消息添加到该队列中。我们使用 SQS 的消息订阅功能将 SNS 主题与该队列关联。
以下是如何将 SNS 消息发送到 SQS 队列的示例代码:
-- -------------------- ---- ------- ----- --- - --- --------- ------- ----------- --- ----- ----------- - ----- ----------- -- - ----- - -------- - - ----- ----------------- ---------- --------- ------------- ------ --------- -- ----- ----------------- - ----- ------------- ------------ -- - ----- - --------------- - - ----- --------------- --------- ------ --------- ------------ --------- ------------ ------------- ------ ---------------- -- ----- --------- - ----- ---------- -- - ----- - -------- - - ----- -------------------- --------- -------- ------------- -- ---------- -- --------------- --- -- - ------ ----- - ----- - ---------- -------------- ---- - - ------------ ------ - ---------- -------------- ----- ---------------- -- -- ----- ------------- - ----- ---------- -------------- -- - ----- ------------------- --------- --------- -------------- ------------- ------------- --
从队列中读取数据
现在消息已经添加到 SQS 队列中了,我们需要从队列中读取数据。为了做到这一点,我们使用 AWS SDK for JavaScript 的 receiveMessage
方法从队列中读取单个消息。我们将解析该消息,并将其用作我们接下来想要实现的 DynamoDB 数据库插入操作的参数。
以下是如何从 SQS 队列中读取数据的示例代码:
const message = await readQueue(queueURL); if (!message) { return; // 没有要处理的消息 } const { MessageId, ReceiptHandle, Body } = message; const { data } = JSON.parse(Body);
将数据存储到 DynamoDB 数据库中
最后,我们需要将数据存储到 DynamoDB 数据库中。为了做到这一点,我们将使用 AWS SDK for JavaScript,将数据用作 putItem
方法的参数。
以下是如何将数据存储到 DynamoDB 数据库中的示例代码:
-- -------------------- ---- ------- ----- -------- - --- -------------- ------- ----------- --- ----- ------- - ----- ------ -- - ----- ------ - - ---------- ---------------- ----- - --- - -- ------- -- ----- - -- --------- -- ---- - -- ------------------- -- -- -- ----- -------- - ----- ----------------------------------- ------ --------- --
总结
在本文中,我们探讨了如何使用消费队列和事件网关来实现无服务架构。我们提供了示例代码来指导你通过 AWS Lambda、API Gateway、SNS、SQS 和 DynamoDB 来完成一个简单的无服务函数。Serverless 架构可以让我们更关注业务逻辑,而不是基础架构的维护和管理,打造更具生产力和弹性的技术方案。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64927fda48841e989404c9d5