队列组

当订阅者注册以接收发布者的消息时,消息传递的 1:N 扇出模式确保发布者发送的任何消息都能到达所有已注册的订阅者。NATS 提供一种名为“队列”的附加功能,允许订阅者注册为某个队列的一部分。属于同一队列的订阅者共同构成了“队列组”。

队列组的工作原理

例如,考虑基于主题名称(subject name)向所有订阅者进行 1:N 模式的消息传递(即使订阅者未加入队列组,也会收到消息)。如果某个订阅者基于队列名称注册,它将始终根据主题名称接收所订阅的消息。然而,如果更多订阅者被添加到同一个队列名称,它们将组成一个队列组,每次队列组接收到消息时,只会随机选择队列组中的一个订阅者来消费该消息。这种分布式队列是 NATS 提供的一种内置负载均衡功能。

优点

  • 确保应用程序容错性
  • 可以扩展或缩减工作负载处理能力
  • 在不产生重复消息的情况下,可灵活地扩展或缩减消费者数量
  • 无需额外配置
  • 队列组由应用程序及其队列订阅者定义,而非服务器配置

队列组名称遵循与 主题 相同的命名规则。首先,它们区分大小写且不能包含空格。建议使用句点 . 对队列组进行层次化结构设计。某些服务器功能(如 队列权限)可以对队列组使用 通配符匹配 来精细化管理。

队列订阅者是实现服务弹性伸缩的理想方案。扩容只需启动另一个应用实例,缩容也只需向应用发送信号终止运行并排空处理中的请求即可。这种灵活性以及无需任何配置变更的特点,使得 NATS 成为能与所有平台技术无缝协作的卓越服务通信技术。

无响应者机制

当以 请求/回复模式 向服务发起请求时,若 NATS 服务器检测到当前没有可用服务(即没有客户端应用在队列组中订阅该主题),服务器会向请求方返回一条 “no-responders” 协议消息,从而中断阻塞的 API 调用。这种机制让应用程序能够立即做出反应,即便面临应用故障或网络分区等状况,也能保障大规模系统始终保持高可用。

把流当队列用

得益于 JetStream,你可以通过将保留策略设置为 WorkQueuePolicy 并利用 pull 消费者,将流用作队列,从而实现处理能力的轻松水平扩展(或者使用一个显式 ACK 的推送型消费者,并配合一个由订阅者组成的队列组)。

队列的地理亲和性

当连接到全球分布的 NATS 超级集群时,由于服务请求消息仅会在本地集群没有可用监听器处理请求时才会路由到其他集群(即其他区域),因此会自动形成地理亲和力。

教程

看看 队列操作指南,自行体验 NATS 队列订阅。