NATS集群发布的消息是发往所有节点,还是仅发往有对应Subject订阅者的节点?
NATS集群消息转发问题解答
核心结论
连接到A节点的客户端发布对应主题的消息时,若B节点没有该主题的订阅者,默认场景下消息不会从A发送到B。
技术原理
NATS集群节点之间会实时同步全量的订阅主题路由表,每个节点都可以明确知道整个集群里哪些节点存在对应主题的订阅者。当节点收到客户端发布的消息时,只会将消息转发给有对应订阅者的节点,不会向无订阅者的节点发送冗余消息,以此最大化集群带宽利用率。
特殊例外场景
只有满足以下任一条件时,消息才会被发送到无订阅者的B节点:
- 你为该主题开启了JetStream持久化功能,且流的多副本配置要求B节点存储该流的数据,此时消息会同步到B节点做持久化,和是否有在线订阅者无关。
- 你配置了主题映射、跨集群网关等自定义路由规则,匹配该主题的消息需要按规则转发到B节点。
快速验证方法
你可以执行nats server request subscriptions命令拉取全集群的订阅路由表,确认节点的订阅分布,也可以开启节点的trace日志直接观测单条消息的转发路径,验证上述逻辑。
内容的提问来源于stack exchange,提问作者CJ McAllister
相关产品推荐
相关产品推荐

