You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何限制指定NATS Subject的订阅数?实现单订阅者需求

如何限制指定NATS Subject的订阅数量?

针对你需要将example.{1,N}这类主题的订阅数严格限制为1的场景,以下是两种服务端层面的可靠实现方式:

一、核心NATS场景:通过账户权限控制实现订阅数限制

NATS的账户级权限配置支持针对特定主题设置最大订阅数,这是强制的服务端限制,能彻底杜绝超过1个订阅者的情况。

配置步骤:

  • 在NATS账户的JWT配置中,为目标主题添加订阅权限,并指定max_subs为1。例如,针对example.*主题的配置片段如下:
permissions:
  subscribe:
    allow:
      - subject: "example.*"
        max_subs: 1
    deny: []
  • 将该配置更新到NATS服务器的账户JWT中(可通过nats account edit命令或直接修改账户配置文件完成)。
  • 当客户端使用该账户尝试订阅第二个example.*下的主题时,NATS服务器会直接拒绝订阅请求并返回错误。

注意:该限制基于账户生效,如果需要跨账户限制,需确保所有可能订阅该主题的账户都配置相同的max_subs规则。

二、JetStream场景:使用独占消费者

如果你的消息通过JetStream持久化,可以为目标主题对应的流配置独占消费者,确保同一时间只有一个消费者能订阅该主题的消息。

实现步骤:

  • 创建流时,确保流覆盖example.*主题(比如将流的主题设置为example.*)。
  • 创建消费者时,指定Exclusive模式,示例Go客户端代码如下:
consumer, err := js.AddConsumer(ctx, "example_stream", &nats.ConsumerConfig{
    Durable:       "exclusive_consumer",
    Exclusive:     true, // 启用独占模式
    FilterSubject: "example.1", // 针对特定子主题,若覆盖所有example.*可留空或设为example.*
})
  • 当第二个客户端尝试创建同一流的独占消费者时,JetStream会返回409 Conflict错误,阻止重复订阅。

额外提示

  • 不要依赖客户端侧的检查:客户端逻辑可能存在漏洞,服务端层面的限制才是最可靠的。
  • 对于动态生成的example.{1,N}主题,使用通配符(example.*)配置权限或流主题,无需逐个配置每个子主题。

内容的提问来源于stack exchange,提问作者alexHX12

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 13:45:22