在本教程中,您将了解如何利用 Amazon Simple Notification Service (SNS) 的消息筛选功能。消息筛选功能可确保订阅某个 SNS 主题的终端节点仅接收它感兴趣的主题消息子集。

在我们的示例中,用户需要访问网站以发布保险报价请求。这些报价请求可用于车险、船险或人寿保险。当用户发布保险报价请求后,请求会被转发到一系列后端系统。有一个处理车险和船险的销售系统,一个处理人寿保险的销售系统,以及一个需要处理所有报价请求的分析系统。

正如我们在发送扇出事件通知教程中所学到的,我们将借助 SNS 和 SQS 的扇出消息收发模式将网站与后端系统分离。要将事件通知发送到正确的后端系统,您可以为每种类型的报价请求创建单独的主题,然后将消息路由逻辑添加到您的发布者。但是,此方法可能会导致发布者过于复杂、主题激增以及预置和管理 SNS 主题产生额外开销。而 SNS 消息筛选要简单得多!

在本教程中,您将使用 Amazon SNS 和 Amazon Simple Queue Service (SQS)。这两种服务都在 AWS 免费套餐范围内。

 

筛选 AWS 上的消息需要拥有账户

创建免费账户

AWS 免费套餐包括 1000000 个 Amazon Simple Notification Service 发布和 1000000 个 Amazon Simple Queue Service 请求。

查看 AWS 免费套餐详细信息 »

 

首先,您要创建一个 Amazon SNS 主题,以便于用户在保险网站上发出报价请求时发布消息。这些请求可能与车险、船险或人寿保险有关。 


a.单击此处之后,AWS 管理控制台将在新的浏览器窗口中打开,因此您可以使本分步指南保持打开状态。此屏幕加载后,请输入您的用户名和密码以便开始操作。然后在搜索栏中键入 notification 并选择 Simple Notification Service 以打开服务控制台。

tmt_filter-messages-sent-to-topics_1a

(单击可缩放)

tmt_filter-messages-sent-to-topics_1a

b.  如果显示 SNS 控制台登录页面,请单击从概览开始。如果您没有看到此页面,请跳至下一步。

1b-console-home

(单击可缩放)

1b-console-home

c.  单击左侧菜单上的主题

1c-create-topic-nav-open

(单击可缩放)

1c-dashboard

d.  单击创建主题

 

1d-No-topics

(单击可缩放)

1d-No-topics

e.  在“主题名称”字段中,键入 Insurance-Quote-Requests,然后向下滚动以单击创建主题

 

1e-create-topic-nav-closed

(单击可缩放)

1e-create-topic-nav-closed

f.  新主题将显示在主题详细信息页面。

 

1f-topic-insurence-quote-request-created-success

(单击可缩放)

1f-topic-insurence-quote-request-created-success

每个保险销售系统都会轮询来自订阅 SNS 主题的相应 SQS 消息队列的报价请求。

第一个队列将处理汽车和船舶保险报价请求;第二个队列将处理人寿保险报价请求;第三个队列将捕获所有报价请求。第三个队列将捕获所有报价请求(无论保险类型如何),以便为分析系统提供信息。这些首选项将被设置为 SNS 订阅的筛选策略。

在此步骤中,您将创建三个队列并为每个队列订阅 SNS 主题。


a.单击此处在新浏览器窗口中打开 Amazon SQS 控制台。如果 SQS 登录页显示,请单击“立即开始使用”。否则,请继续执行下一步。

 

tmt_filter-messages-sent-to-topics_2a

(单击可缩放)

tmt_filter-messages-sent-to-topics_2a

b.  在 Create New Queue(新建队列)页面上,在 Queue Name(队列名称)字段中输入 Vehicle-Insurance-Quotes

保留 Standard Queue(标准队列)的选中状态,然后单击 Quick-Create Queue(快速创建队列)。

 

tmt_filter-messages-sent-to-topics_2b

(单击可缩放)

tmt_filter-messages-sent-to-topics_2b

c.  单击 Create New Queue(新建队列),然后重复第 2b 步再创建两个队列:
Life-Insurance-Quotes
All-Quotes

 

tmt_filter-messages-sent-to-topics_2c

(单击可缩放)

tmt_filter-messages-sent-to-topics_2c

d.  现在,所有三个队列都列在 SQS 控制台中。

 

tmt_filter-messages-sent-to-topics_2d

(单击可缩放)

tmt_filter-messages-sent-to-topics_2d

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


a.  从队列列表中选择 Vehicle-Insurance-QuotesLife-Insurance-QuotesAll-Quotes 队列。

单击队列操作,然后选择为队列订阅 SNS 主题

 

 

tmt_filter-messages-sent-to-topics_3a

(单击可缩放)

tmt_filter-messages-sent-to-topics_3a

b.  此时会显示 Subscribe to a Topic(订阅主题)对话框。从选择一个主题下拉列表中选择 Insurance-Quote-Requests 主题,这是您想为您的三个队列订阅的主题。由于您使用同一账户创建了 SNS 主题,因此它会显示在列表中。

如果 SNS 主题是由其他账户创建的,您可以使用主题 ARN 字段来进行订阅。有关更多详细信息,请参阅 Amazon SNS 文档或我们的博客文章 Cross-Account Integration with SNS

 

 

tmt_filter-messages-sent-to-topics_3b

(单击可缩放)

tmt_filter-messages-sent-to-topics_3b

c.  请勿更改 Topic Region(主题区域),并单击 Subscribe(订阅)。 

 

 

tmt_filter-messages-sent-to-topics_3c

(单击可缩放)

tmt_filter-messages-sent-to-topics_3c

d.  此时将显示 Topic Subscription Result(主题订阅结果)对话框。单击 OK(确定)。

tmt_filter-messages-sent-to-topics_3d

(单击可缩放)

tmt_filter-messages-sent-to-topics_3d

至此,您已经创建了所有 SNS 和 SQS 资源,接下来可以为您的 SNS 订阅设置筛选策略。筛选策略是简单的 JSON 文档,它被设置为 SNS 订阅的一个属性,该属性定义了订阅者感兴趣的通知类型。

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


a.  在其他浏览器窗口中返回到 Amazon SNS 控制台,然后单击主题以查找该区域中所有主题的列表。

单击列表中的主题名称 Insurance-Quote-Requests。  

4a-topic-list

(单击可缩放)

4a-topic-list

b.  执行此操作后,您会转到 Insurance-Quote-Requests 主题详细信息页面,您可以在其中查看订阅该 SNS 主题的所有 SQS 队列。选择 Vehicle-Insurance-Quotes 队列,然后单击编辑

4b-topic-detail-insurance-quote-request

(单击可缩放)

4b-topic-detail-insurance-quote-request

c.  执行此操作后,您会转到编辑订阅页面。单击箭头以编辑订阅筛选策略。 

4c-edit-sub-insurance-quote-request

(单击可缩放)

4c-edit-sub-insurance-quote-request

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

单击保存更改

4d-topic-edit-filter-car-boat

(单击可缩放)

4d-topic-edit-filter-car-boat

e.  此时将出现一个确认对话框,确认已成功创建订阅筛选策略。

 

4e-sub-saved-success

(单击可缩放)

4e-sub-saved-success

f.  现在,您将重复此过程,将筛选策略添加到第二个队列。选择 Life-Insurance-Quotes 队列,然后单击“编辑”。

单击箭头以编辑订阅筛选策略。

在随即出现的对话框中,输入以下 JSON 对象:{"insurance_type": ["life"]}

单击“保存更改”。

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

4f-topic-edit-filter-life

(单击可缩放)

4f-topic-edit-filter-life

让我们来测试一下! 在此步骤中,您将能够通过向主题发布消息来模拟来自潜在客户生成网站的新保险报价请求。

您将发布具有不同属性的消息,以便查看正在运行的 Amazon SNS 消息筛选机制。


a.  在 Insurance-Quote-Requests 主题页面上,单击发布消息

5a-topic-detail-with-3subs-2

(单击可缩放)

5a-topic-detail-with-3subs-2

b.  通过在表单中输入以下值来创建第一条消息:

在“主题”中输入 Insurance Quote Request #1

在“消息结构”中,让为所有传送协议提供相同的有效负载保留选中状态

在“要发送到终端节点的消息正文”中,输入以下文字来代表车险报价请求:
2017 Volvo S60, Montreal

消息属性中:

  • 类型字段中,选择字符串
  • 名称字段中,输入 insurance_type
  • 字段中,输入 car

单击发布消息

5b-publish-message-montreal-address

(单击可缩放)

5b-publish-message-montreal-address

c.  您将返回到 Insurance-Quote-Requests 主题页面。再次单击发布消息,然后使用以下值创建第二条消息:

主题中,输入 Insurance Quote Request #2

消息结构中,让为所有传送协议提供相同的有效负载保留选中状态

要发送到终端节点的消息正文中,输入以下文字来代表车险报价请求:
Male, 33 years old, Vancouver

消息属性中:

  • 类型字段中,选择字符串
  • 名称字段中,输入 insurance_type
  • 字段中,输入 life

单击发布消息

5c-publish-message-male33

(单击可缩放)

5c-publish-message-male33

d.  您将返回到 Insurance-Quote-Requests 主题页面。再次单击发布消息,然后使用以下值创建第二条消息:

主题中,输入 Insurance Quote Request #3

消息结构中,让为所有传送协议提供相同的有效负载保留选中状态

在“要发送到终端节点的消息正文”中,输入以下文字来代表车险报价请求:
Townhouse, 1500 sq ft, Toronto

消息属性中:

  • 类型字段中,选择字符串
  • 名称字段中,输入 insurance_type
  • 字段中,输入 home

单击发布消息

5d-publish-message-toronto-address

(单击可缩放)

5d-publish-message-toronto-address

此时,您要通过检查发生的消息传送来验证每种类型的保险报价请求是否已路由到其对应的 SQS 消息队列。

您会发现,只有当相应的 SNS 订阅具有与此传入消息的属性匹配的筛选策略时,订阅的 Amazon SQS 队列才会收到消息。

尤其是,您还会注意到,有一个队列实际上收到了发布到该主题的所有消息。发生这种情况是因为此订阅没有设置筛选策略,因此导致该队列能够捕获所有消息。


a.  返回 Amazon SQS 控制台。选择 Vehicle-Insurance-Quotes 队列,然后单击 Queue Actions(队列操作)。

选择 View/Delete Messages(查看/删除消息)。 

tmt_filter-messages-sent-to-topics_6a

(单击可缩放)

tmt_filter-messages-sent-to-topics_6a

b.  单击 Start Polling for Messages(开始轮询消息)。

请注意,只有一条消息被推送到了此队列,该消息与汽车保险报价相关 (Insurance Quote Request #1)。关闭该对话框。

tmt_filter-messages-sent-to-topics_6b

(单击可缩放)

tmt_filter-messages-sent-to-topics_6b

c.  针对第二个队列重复该过程。选中 Life-Insurance-Quotes 队列对应的复选框。从 Queue Action(队列操作)下拉列表中,选择 View/Delete Messages(查看/删除消息)。

单击 Start Polling for Messages(开始轮询消息)。

请注意,另一条消息被推送到了此队列,该消息与人寿保险报价相关 (Insurance Quote Request #2)。

单击 Close(关闭)。

tmt_filter-messages-sent-to-topics_6c

(单击可缩放)

tmt_filter-messages-sent-to-topics_6c

d.  最后,选中 All-Quotes 队列对应的复选框。单击 Queue Actions(队列操作),选择 View/Delete Messages(查看/删除消息),然后单击 Start Polling for Messages(开始轮询消息)。

请注意,所有三条消息都被推送到了此队列(Insurance Quote Requests #1、#2 和 #3)

单击 Close(关闭)。

tmt_filter-messages-sent-to-topics_6d

(单击可缩放)

tmt_filter-messages-sent-to-topics_6d

在此步骤中,您将删除在本教程中创建的资源,包括主题主题、订阅和队列。最好删除您不再使用的资源,以避免产生费用。


a.  在 Amazon SNS 控制台中,单击主题,然后单击 Insurance-Quote-Requests 主题链接。

步骤 7a

(单击可缩放)

步骤 7a

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

单击对话框中的删除以确认删除。 

7b-topic-detail-with-3subs

(单击可缩放)

7b-topic-detail-with-3subs

c.  在 Insurance-Quote-Requests 主题详细信息页面上,单击删除

在对话框中键入 delete me 并单击删除,以此确认删除。 

 

7c-topic-detail-no-sub

(单击可缩放)

7c-topic-detail-no-sub

d.  返回 Amazon SQS 控制台。选择您在此教程中使用的所有三个队列,单击 Queue Actions(队列操作),然后单击 Delete Queues(删除队列)。

在对话框中确认删除。

tmt_filter-messages-sent-to-topics_7d

(单击可缩放)

tmt_filter-messages-sent-to-topics_7d

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

tmt_filter-messages-sent-to-topics_7e

(单击可缩放)

tmt_filter-messages-sent-to-topics_7e

您现在可以使用 Amazon Simple Notification Service (SNS) 上的消息筛选来构建更简单且更高效的发布/订阅架构。

利用消息筛选功能,Amazon SNS 主题订阅者能够选择性地只接收一部分他们感兴趣的消息,而不是接收发布至某个主题的所有消息。这消除了在您的订阅者中实施消息筛选逻辑或在您的发布者系统中实施消息路由逻辑的设计复杂性。


现在您已学习了如何使用 Amazon Simple Notification Service 实施消息筛选。请选择以下选项之一来深入了解 AWS 上的云消息收发。

了解更多

概要了解 Amazon Web Services (AWS) 上消息主题的功能、组件和使用案例。

访问 Amazon SNS 网页 »

深入了解

浏览“开发人员指南”,了解如何为您的 SNS 主题实施消息筛选。

阅读文档 »

查看实际效果

浏览一个示例,了解如何使用适用于 Python 的 AWS 开发工具包实施消息筛选。

阅读博客 »