使用 Amazon SNS 和 Amazon SQS 筛选已发布到主题的消息
概述
在本教程中,您将学习如何使用 Amazon Simple Notification Service (Amazon SNS) 的消息筛选功能。消息筛选功能允许 SNS 主题的订阅者仅接收自己感兴趣的主题消息的子集。
在我们的示例中,用户访问网站以请求保险报价。用户可以请求车辆保险(如汽车和船只保险)、人寿保险或其他保险类型(如房屋保险)的报价。当用户请求保险报价时,该请求会转发到一系列后端系统:一个处理汽车和船只保险的销售系统、一个处理人寿保险的销售系统和一个处理所有报价请求的分析系统。
与“发送扇出事件通知”教程一样,我们将使用 Amazon SNS 和 Amazon Simple Queue Service (Amazon SQS) 的扇出消息传递模式将网站与后端系统解耦。为了将事件通知发送到正确的后端系统,您可以为每种类型的报价请求创建一个单独的主题,然后向发布者添加消息路由逻辑。但是,这种选择可能会导致发布程序过于复杂、主题激增并在预配和管理 SNS 主题方面产生额外的开销。而 Amazon SNS 消息筛选则简单得多。
您将在本教程中使用 Amazon SNS 和 Amazon SQS。这两个服务均可通过 AWS Free Tier 免费试用。
AWS 使用经验
中级
完成时间
30 分钟
所需费用(使用免费指标)
免费
所需费用(使用高级指标)
价格可能有所不同:每月每百万个受监控对象 0.20 美元( Amazon S3 定价页面)
前提条件
AWS 账户和填充的 Amazon S3 存储桶
使用的服务
上次更新时间
2022 年 8 月 23 日
执行步骤
步骤 1:创建 SNS 主题
第一步是创建一个 Amazon SNS 主题,这样每当保险网站收到报价请求时都能发布消息。这些潜在客户可能会请求有关汽车保险、船只保险或人寿保险的报价。
a. 在新的浏览器窗口中打开 AWS 管理控制台,使本分步指南保持打开状态。页面加载后,输入您的用户名和密码即可开始使用。然后在搜索栏中输入 notification,并选择 Simple Notification Service 以打开该服务控制台。
e. 对于 Type(类型),选择 Standard(标准)。在 Name(名称)字段中输入 Insurance-Quote-Requests,然后向下滚动并点击 Create topic(创建主题)按钮。
步骤 2:创建 Amazon SQS 队列
a. 在新的浏览器窗口中打开 Amazon SQS 控制台。如果出现 Amazon SQS 登录页面,则点击 Create queue(创建队列)。否则,转到下一步。
b. 在 Create queue(创建队列)页面上,使 Type(类型)下的 Standard(标准)处于选中状态。在 Name(名称)字段中输入 Vehicle-Insurance-Quotes,然后向下滚动并点击 Create queue(创建队列)按钮。
步骤 3:为队列订阅主题
现在,您已创建了三个 SQS 队列,需要为这些队列订阅 SNS 主题,SNS 主题用于广播新的保险报价请求。
如果 SNS 主题是用另一个账户创建的,您可以使用 Topic ARN(主题 ARN)字段来订阅该主题。有关更多详细信息,请参阅 Amazon SNS 文档或我们的博客文章与 Amazon SNS 进行跨账户集成。
步骤 4:为 SNS 订阅分配筛选策略
无筛选策略的订阅将收到向 SNS 主题发布的所有消息,因此在该场景中,您无需为 All-Quotes 队列设置筛选策略。
在列表中选择名为 Insurance-Quote-Requests 的主题。
b. 您将进入 Insurance-Quote-Requests 的主题详细信息页面,在该页面上,您将会看到订阅此 SNS 主题的所有 SQS 队列。选择 Vehicle-Insurance-Quotes 队列,然后点击 Edit(编辑)。
c. 您将进入 Edit subscription(编辑订阅)页面。选择 Subscription filter policy(订阅筛选策略)左侧的箭头,然后选择 Enabled(启用)以编辑该策略。
步骤 5:将消息发布到主题
让我们对其进行测试。在此步骤中,您将通过向主题发布消息来模拟从潜在客户生成网站传入的新保险报价请求。
2017 Volvo S60, Montreal
在 Message attributes(消息属性)中:
- 在 Type(类型)字段中选择 String(字符串)
- 在 Name(名称)字段中输入 insurance_type
- 在 Value(值)字段中输入 car
点击 Publish message(发布消息)。
d. 使用以下值创建第二则消息:
在 Message attributes(消息属性)中:
- 在 Type(类型)字段中选择 String(字符串)
- 在 Name(名称)字段中输入 insurance_type
- 在 Value(值)字段中输入 life
点击 Publish message(发布消息)。
e. 返回 Insurance-Quote-Requests 主题页面。再次点击 Publish message(发布消息)。
Townhouse, 1500 sq ft, Toronto
在 Message attributes(消息属性)中:
- 在 Type(类型)字段中选择 String(字符串)
- 在 Name(名称)字段中输入 insurance_type
- 在 Value(值)字段中输入 home
点击 Publish message(发布消息)。
步骤 6:检验消息传输
现在,您可以通过检查传入的消息来验证每种类型的保险报价请求是否已路由到其相应的 Amazon SQS 消息队列。
c. 请注意,只有一则消息 (Insurance Quote Request #1) 被推送到这个与汽车保险报价有关的队列中。轮询过程完成后,在 Messages(消息)下面选择消息来查看已推送到队列的消息。
c. 请注意,只有一则消息 (Insurance Quote Request #2) 被推送到这个与人寿保险报价有关的队列中。轮询过程完成后,在 Messages(消息)下面选择消息来查看已推送到队列的消息。
步骤 7:清除资源
在此步骤中,您将删除在学习本教程的过程中创建的资源(包括一个主题、多个订阅和多个队列)。最佳做法是删除不再使用的资源,这样就不会产生费用。
结论
您现在可以在 Amazon SNS 中使用消息筛选功能构建更简单、更合理的发布/订阅架构。
消息筛选功能使 Amazon SNS 主题订阅者能够有选择地接收消息,订阅者不必接收发布到相关主题的所有消息,而是仅接收其感兴趣的消息子集。您可以从订阅者系统中卸载消息筛选逻辑,也可以从发布者系统中卸载消息路由逻辑。