使用 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 以打开该服务控制台。

b. 如果出现 SNS 控制台登录页面,则选择 Start with an overview(从概览开始)。如果您没有看到此页面,请跳到下一步。

c. 在导航窗格中选择 Topics(主题)。

d. 点击 Create topic(创建主题)按钮。

e. 对于 Type(类型),选择 Standard(标准)。在 Name(名称)字段中输入 Insurance-Quote-Requests,然后向下滚动并点击 Create topic(创建主题)按钮。

f. 新主题将出现在 Topic details(主题详细信息)页面上。

步骤 2:创建 Amazon SQS 队列

每个保险销售系统都是从已订阅 SNS 主题的相应 SQS  消息队列轮询报价请求。
 
第一个队列将处理汽车和船只保险的报价请求;第二个队列将处理人寿保险的报价请求;第三个队列将捕获所有的报价请求。无论哪种保险类型,第三个队列都会捕获所有报价请求以将其提供给分析系统。这些首选项将被设置为 SNS 订阅的筛选策略。
 
在此步骤中,您将创建三个队列,并为每个队列订阅 SNS 主题。

a. 在新的浏览器窗口中打开 Amazon SQS 控制台。如果出现 Amazon SQS 登录页面,则点击 Create queue(创建队列)。否则,转到下一步。

b. 在 Create queue(创建队列)页面上,使 Type(类型)下的 Standard(标准)处于选中状态。在 Name(名称)字段中输入 Vehicle-Insurance-Quotes,然后向下滚动并点击 Create queue(创建队列)按钮。

c. 新队列将出现在 Queue details(队列详细信息)页面上。点击 Queues(队列)可返回 Queues(队列)登录页面。

d. 点击 Create queue(创建队列)按钮,并重复步骤 2b 和 2c,再创建两个命名为 Life-Insurance-Quotes 和 All-Quotes 的队列。

e. 所以三个队列现已显示在 Amazon SQS 控制台上的队列列表中。

步骤 3:为队列订阅主题

现在,您已创建了三个 SQS 队列,需要为这些队列订阅 SNS 主题,SNS 主题用于广播新的保险报价请求。

a. 在队列列表中,选择 All-Quotes 队列。

选择 Actions(操作),然后选择 Subscribe to Amazon SNS topic(订阅到 Amazon SNS 主题)。

b. 系统显示  Subscribe to Amazon SNS topic(订阅到 Amazon SNS 主题)对话框。从  Specify an Amazon SNS topic available for this queue(为此队列指定可用的 Amazon SNS 主题)下拉菜单中,选择您将为三个队列订阅的 Insurance-Quote-Requests 主题。由于 SNS 主题是用同一个账户创建的,因此该主题会显示在下拉菜单中。

如果 SNS 主题是用另一个账户创建的,您可以使用 Topic ARN(主题 ARN)字段来订阅该主题。有关更多详细信息,请参阅 Amazon SNS 文档或我们的博客文章与 Amazon SNS 进行跨账户集成

c. 点击 Save(保存)。

d. 该队列现已订阅 SNS 主题。点击 Queues(队列)返回 Queues(队列)页面,并对 Life-Insurance-Quotes 和 Vehicle-Insurance-Quotes 队列重复步骤 a 到 c。

步骤 4:为 SNS 订阅分配筛选策略

现在已经创建了所有的 Amazon SNS 和 Amazon SQS 资源,可以为 SNS 订阅分配筛选策略了。筛选策略是设置为 SNS 订阅属性的简单 JSON 文档,用于定义订阅者感兴趣的通知类型。

无筛选策略的订阅将收到向 SNS 主题发布的所有消息,因此在该场景中,您无需为 All-Quotes 队列设置筛选策略。

a. 在另一个浏览器窗口中返回 Amazon SNS 控制台,在导航窗格中选择  Topics(主题),列出区域中的所有  Topics(主题)。

在列表中选择名为 Insurance-Quote-Requests 的主题。 

b. 您将进入 Insurance-Quote-Requests 的主题详细信息页面,在该页面上,您将会看到订阅此 SNS 主题的所有 SQS 队列。选择 Vehicle-Insurance-Quotes 队列,然后点击 Edit(编辑)。

c. 您将进入 Edit subscription(编辑订阅)页面。选择 Subscription filter policy(订阅筛选策略)左侧的箭头,然后选择 Enabled(启用)以编辑该策略。

d. 在出现的对话框中,在 JSON 编辑器中输入以下 JSON 对象:
{"insurance_type": ["car", "boat"]}

点击 Save changes(保存更改)。

e. 系统显示一则确认消息,表明订阅筛选策略已保存成功。点击 Insurance-Quote-Requests 返回主题详细信息页面。

f. 现在,您将重复上述过程,向第二个队列中添加筛选策略。选择 Life-Insurance-Quotes 队列,然后点击 Edit(编辑)。

g. 选择 Subscription filter policy(订阅筛选策略)左侧的箭头,然后选择 Enabled(启用)以编辑该策略。

h. 在出现的对话框中,在 JSON 编辑器中输入以下 JSON 对象:
{"insurance_type": ["life"]}

 
点击  Save changes(保存更改)。

 

您无需为与 All-Quotes 队列有关的订阅设置任何筛选策略。由于没有策略,此队列将会捕获所有发布到该主题的事件。

步骤 5:将消息发布到主题

让我们对其进行测试。在此步骤中,您将通过向主题发布消息来模拟从潜在客户生成网站传入的新保险报价请求。

您将发布具有不同属性的消息,因此您可以查看使用中的 Amazon SNS 消息筛选机制。

a. 在 Insurance-Quote-Requests 主题页面上,点击 Publish message(发布消息)。

b. 在表单中输入以下值来创建第一则消息:
 
在  Subject(主题)中,输入  Insurance Quote Request #1
 
在  Message structure(消息结构)中,使  Identical payload for all delivery protocols(所有传输协议的有效负载相同)保持选中状态。
 
在  Message body to send to the endpoint(要发送到端点的消息主体)中,输入以下文本来表示汽车保险报价请求:

2017 Volvo S60, Montreal

在 Message attributes(消息属性)中:

  •  Type(类型)字段中选择 String(字符串)
  • 在 Name(名称)字段中输入 insurance_type
  • 在 Value(值)字段中输入 car

点击 Publish message(发布消息)。

c. 返回 Insurance-Quote-Requests 主题页面。再次点击 Publish message(发布消息)。

d. 使用以下值创建第二则消息:

在  Subject(主题)中,输入  Insurance Quote Request #2。
 
在  Message structure(消息结构)中,使  Identical payload for all delivery protocols(所有传输协议的有效负载相同)保持选中状态。
 
在  Message body to send to the endpoint(要发送到端点的消息主体)中,输入以下文本来表示人寿保险报价请求:
 
Male, 33 years old, Vancouver

在 Message attributes(消息属性)中:

  • 在 Type(类型)字段中选择 String(字符串)
  • 在 Name(名称)字段中输入 insurance_type
  • 在 Value(值)字段中输入 life

点击 Publish message(发布消息)。

e. 返回 Insurance-Quote-Requests 主题页面。再次点击 Publish message(发布消息)。

f. 使用以下值创建第三则消息:
 
 Subject(主题)中,输入  Insurance Quote Request #3
 
在  Message structure(消息结构)中,使  Identical payload for all delivery protocols(所有传输协议的有效负载相同)保持选中状态。
 
在  Message body to send to the endpoint(要发送到端点的消息主体)中,输入以下文本来表示房屋保险报价请求:

Townhouse, 1500 sq ft, Toronto

 Message attributes(消息属性)中:

  • 在 Type(类型)字段中选择 String(字符串)
  • 在 Name(名称)字段中输入 insurance_type
  • 在 Value(值)字段中输入 home

点击 Publish message(发布消息)。

步骤 6:检验消息传输

现在,您可以通过检查传入的消息来验证每种类型的保险报价请求是否已路由到其相应的 Amazon SQS 消息队列。

您将看到,对于订阅的 Amazon SQS 队列,只有当它对应的 Amazon SNS 订阅具有与此传入消息的属性相匹配的筛选策略时,该队列才会收到消息。
 
您还将注意到一个特别的队列,这个队列实际上收到了发布到该主题的所有消息。出现这种情况的原因是此订阅尚未设置筛选策略集,从而导致“捕获所有”行为的发生。

a. 返回 Amazon SQS 控制台。选择 Vehicle-Insurance-Quotes 队列,然后点击 Send and receive messages(发送和接收消息)。

b. 点击 Poll for messages(轮询消息)。

c. 请注意,只有一则消息 (Insurance Quote Request #1) 被推送到这个与汽车保险报价有关的队列中。轮询过程完成后,在 Messages(消息)下面选择消息来查看已推送到队列的消息。

d. 查看此消息,然后点击 Done(完成)以关闭该对话框。

e. 对第二个队列重复上述过程。选择 Life-Insurance-Quotes 队列,然后点击 Send and receive messages(发送和接收消息)。

f. 点击 Poll for messages(轮询消息)。

c. 请注意,只有一则消息 (Insurance Quote Request #2) 被推送到这个与人寿保险报价有关的队列中。轮询过程完成后,在 Messages(消息)下面选择消息来查看已推送到队列的消息。

h. 查看此消息,然后点击 Done(完成)以关闭该对话框。

i. 最后,选择 All-Quotes 队列,然后点击 Send and receive messages(发送和接收消息)。

j. 点击 Poll for messages(轮询消息)。

k.请注意,所有三则消息(Insurance Quote Request #1、Insurance Quote Request #2 和 Insurance Quote Request #3)都已推送到此队列中。

步骤 7:清除资源

在此步骤中,您将删除在学习本教程的过程中创建的资源(包括一个主题、多个订阅和多个队列)。最佳做法是删除不再使用的资源,这样就不会产生费用。

a. 在 Amazon SNS 控制台的导航窗格中,选择 Topics(主题),然后选择 Insurance-Quote-Requests 主题链接。

b. 在 Insurance-Quote-Requests 的主题详细信息页面上,选择每个订阅,然后点击 Delete(删除)。

c. 在出现的对话框中点击 Delete(删除)以确认删除。

d. 在 Insurance-Quote-Requests 的主题详细信息页面中,点击 Delete(删除)。

e. 在出现的对话框中输入 delete me 以确认删除,然后点击 Delete(删除)。

f. 返回 Amazon SQS 控制台。选择本教程中使用的每个队列,然后点击 Delete(删除)。

g. 在出现的对话框中输入 delete 以确认删除,然后点击 Delete(删除)。

h. 您现在可以退出 AWS 管理控制台了。

结论

您现在可以在 Amazon SNS 中使用消息筛选功能构建更简单、更合理的发布/订阅架构。

消息筛选功能使 Amazon SNS 主题订阅者能够有选择地接收消息,订阅者不必接收发布到相关主题的所有消息,而是仅接收其感兴趣的消息子集。您可以从订阅者系统中卸载消息筛选逻辑,也可以从发布者系统中卸载消息路由逻辑。

此页内容对您是否有帮助?

后续步骤