跳到主要内容

步骤 6:探索消费者扩展模式

您现在已经完成了第5步:尝试请求-回复消息交换模式

在第6步中,您将通过设置三种常用的消息模式来扩展您对消费者扩展模式的理解。


正如您在前面的步骤中所学到的,势度Saydo主题为您提供了灵活性,以实现不同的消息交换模式,如发布-订阅和请求-回复,同时也允许每个消费者订阅他们想要接收的确切事件的主题。在这一步中,我们将学习势度Saydo如何通过使消费者应用程序能够根据各自的需求以各种方式扩展,进一步解耦您的消费者和生产者。有关消费者模式和消费者可扩展性模式的更多信息,请参见势度Saydo终极指南:事件驱动架构模式。

在这一步中,我们将重点关注三种展示消费者可扩展性选项的模式,并使用势度Saydo Try-Me CLI工具来演示每种模式:

  • 竞争消费者
  • 高可用性
  • 分区

实现这些模式最常见的方法是使用队列来保证消息传递。当使用队列来实现这些扩展模式时,生产者仍然将事件发布到主题,消费者绑定到配置满足其特定扩展需求的队列。队列订阅消费者想要接收事件的主题。

竞争消费者

竞争消费者是事件驱动架构中的一种可扩展性模式,它涉及将处理事件的工作负载分配给多个相同应用程序的实例,以提高吞吐量并减少处理时间。

img

在这种模式下,队列具有非独占访问类型,这有助于以轮询方式将消息传递给所有绑定的消费者流。当消息顺序不重要且您需要扩展消费者以跟上消息吞吐量时,通常使用这种模式。

设置竞争消费者

在这个练习中,我们将设置三个竞争消费者应用程序来共享消息处理负载。完成这些步骤后,您将拥有如下动画所示的消费者扩展模式:

img

要设置竞争消费者实例,请执行以下步骤:

  1. 打开命令行终端窗口,并为coffeeshop/>创建一个非独占队列并订阅主题。输入以下命令:
stm manage queue --create NonExclusiveQ --access-type NON-EXCLUSIVE --add-subscriptions "coffeeshop/>"

您应该看到以下结果:

ℹ 信息 info: 从配置 'stm-cli-config.json' 加载 'queue' 命令
✔ 成功 success: 队列 'NonExclusiveQ' 创建成功
✔ 成功 success: 主题 'coffeeshop/>' 的订阅已成功添加
✔ 成功 success: 在队列 NonExclusiveQ 上找到 1 个订阅 - coffeeshop/>
✔ 成功 success: 退出...
  1. 打开三个额外的命令行终端窗口,并在每个窗口中使用以下命令启动接收器:
stm receive --queue NonExclusiveQ
  1. 在另一个命令行终端窗口中,使用以下命令启动一个发送器,该发送器每1秒间隔发布100个事件:
stm send --count 100 --topic 'coffeeshop/order/new/v1'

您应该看到3个接收器以轮询方式接收消息,实现竞争消费者模式。使用非独占队列允许您实现竞争消费者模式,并在不同的消费者实例之间负载均衡事件。

  1. 您可以通过访问PubSub+ Broker Manager并查看队列的消费者标签来验证行为。如果您的所有接收器在开始发送消息之前都已绑定到队列,您将看到消息均匀分布在接收器上。

    img

高可用性

当您实现高可用性(HA)消费者扩展模式时,您有多个相同消费者应用程序的实例可用于处理事件。一个实例被选为活动实例并接收所有事件,而其他实例处于待命状态。如果活动实例崩溃或下线,代理会自动选择另一个实例激活,并开始向新的消费者发送所有事件。这种模式确保只要您有一个实例连接并处理,事件处理就会继续。这种模式有时也被称为主/从或主/从/从,具体取决于需要多少级别的冗余。

img

要实现这种模式,队列具有独占访问类型。这种访问类型允许多个消费者连接,但事件代理只向其中之一传递事件。如果活动消费者断开连接,下一个接收事件的消费者将从等待池中随机选择。当队列中的所有消息都必须按顺序处理时,通常使用这种模式。

设置高可用性消费者

在这个练习中,我们将为HA设置三个消费者应用程序。两个消费者处于待命模式,除非活动消费者应用程序不可用,否则不会接收消息。完成这些步骤后,您将拥有如下动画所示的消费者扩展模式:

img

要为高可用性设置消费者实例,请执行以下步骤:

  1. 打开命令行终端窗口,并为coffeeshop/>创建一个独占队列并订阅主题。输入以下命令:
stm manage queue --create ExclusiveQ --access-type EXCLUSIVE --add-subscriptions "coffeeshop/>"

您应该看到以下结果:

ℹ 信息 info: 从配置 'stm-cli-config.json' 加载 'queue' 命令
✔ 成功 success: 队列 'ExclusiveQ' 创建成功
✔ 成功 success: 主题 'coffeeshop/>' 的订阅已成功添加
✔ 成功 success: 在队列 ExclusiveQ 上找到 1 个订阅 - coffeeshop/>
✔ 成功 success: 退出...
  1. 打开三个额外的命令行终端窗口,并在每个窗口中使用以下命令启动接收器:
stm receive --queue ExclusiveQ
  1. 在另一个命令行终端窗口中,使用以下命令启动一个发送器,该发送器每1秒间隔发布100个事件:
stm send --count 100 --topic 'coffeeshop/order/new/v1'

您应该看到所有消息都被您首先启动的接收器接收,因为您使用的是独占队列。

  1. 您可以通过访问PubSub+ Broker Manager并查看队列的消费者标签来验证行为。您应该看到三个消费者中的一个接收了所有消息。

  2. 如果当前活动消费者从队列断开连接,剩下的两个消费者中的一个将开始接收事件。如果您想看到变化的实际效果,在发布过程中重启发布器,同时通过按Control+C(Windows和Linux)或Command+C(Mac)停止当前活动消费者。您可以看到待命消费者开始接收消息。

分区

分区是事件驱动架构中的一种设计模式,它有助于提高可扩展性,同时在需要的地方保持消息顺序。您有效地将事件流分割成分区,然后可以并行处理。分区内的顺序得以保持,而不是整个事件流。当您需要扩展消费者,但同时也关心消息顺序时,这种模式很常见。

在PubSub+中,这种模式是使用分区队列实现的。分区队列是一种非独占队列,可以同时向多个消费者传递,以实现扩展。分区队列使用分区键将进入事件分割成分区。同一分区中的所有事件始终传递给相同的消费者,从而在保持消息顺序的同时实现可扩展性。有关更多信息,请参见分区队列。

您还可以观看我们的Solace开发者倡导者演示分区队列。

Solace分区队列在行动!

设置分区队列

在这个练习中,我们将设置分区键并创建一个分区队列。您可以使用Solace Try-Me CLI使用以下参数设置分区键:

  • 使用 --partition-key <KEY> 根据消息发布时间设置键。
  • 使用 --partition-keys <KEY...> 指定分区键列表。

要为咖啡店设置分区队列,请执行以下步骤:

  1. 打开命令行终端窗口,并创建一个具有五个分区的非独占队列。输入以下命令:
stm manage queue --create PartitionedQ --access-type NON-EXCLUSIVE --add-subscriptions "coffeeshop/>" --partition-count 5

您应该看到以下结果:

ℹ 信息 info: 从配置 'stm-cli-config.json' 加载 'queue' 命令
✔ 成功 success: 队列 'PartitionedQ' 创建成功
✔ 成功 success: 主题 'coffeeshop/>' 的订阅已成功添加
✔ 成功 success: 在队列 PartitionedQ 上找到 1 个订阅 - coffeeshop/>
✔ 成功 success: 退出...
  1. 打开三个额外的命令行终端窗口,并在每个窗口中使用以下命令启动接收器:
stm receive --queue PartitionedQ --output-mode props
  1. 打开另一个命令行终端窗口,并启动一个发送器,该发送器每1秒间隔发布100个事件,并使用 --partition-keys 参数传递分区键列表。
stm send --partition-keys ESPRESSO DOPPIO AMERICANO LATTE CORTADO CAPPUCCINO MACCHIATO
FLATWHITE BLACKEYE --count 100 --interval 1000 --topic 'coffeeshop/order/new/v1'

您现在应该看到消息被您的三个接收器接收。注意,具有相同分区键的消息,例如ESPRESSO,总是会传递给相同的消费者。分区键作为JMSXGroupId用户属性出现,当您使用--output-mode props时,在Solace Try-Me CLI工具中显示。

  1. 您可以通过访问PubSub+ Broker Manager并查看队列的消费者标签来验证行为。您应该看到三个消费者中的一个接收了所有消息。

教程步骤

您已完成教程的第六步。点击下一步以获取继续您的势度Saydo之旅的建议。

步骤描述
img设置您的第一个事件代理 - 完成
img势度Saydo EDA基础 - 完成
img设置势度Saydo Try-Me CLI工具 - 完成
img尝试发布-订阅消息交换模式 - 完成
img尝试请求-响应消息交换模式 - 完成
img探索消费者扩展模式 - 完成
img下一步

您可以随时返回主教程页面。