英文版本为准
本页译自英文,由模型翻译。若与英文原文存在差异,以英文原文为准。
Subject
Core NATS 在消息到达的那一刻,把它投递给 subject 匹配的每个订阅,以及队列组中的一个成员,并且什么也不存储。
以文字阅读本图
- 队列组 billing: orders.*.created 成员 1 收到; orders.*.created 成员 2 收不到
- 发布者 orders.eu.created → NATS 服务器 把 subject 与它此刻 持有的 每个订阅 逐一匹配: 发布
- NATS 服务器 把 subject 与它此刻 持有的 每个订阅 逐一匹配 → orders.eu.created 相同的 subject
- NATS 服务器 把 subject 与它此刻 持有的 每个订阅 逐一匹配 → orders.*.created * 匹配一个 token
- NATS 服务器 把 subject 与它此刻 持有的 每个订阅 逐一匹配 → orders.> > 匹配其余部分
- NATS 服务器 把 subject 与它此刻 持有的 每个订阅 逐一匹配 → orders.*.created 成员 1 收到
- orders.us.* 不匹配
- 没有订阅匹配的消息被丢弃: Core NATS 什么也不存储
subject 是由点分隔的一串 token。订阅的 subject 可以包含通配符。* 恰好代表一个 token。> 代表一个或多个 token,并且只能放在最后。发布总是给出完整的 subject,不带通配符。
服务器把消息复制给每个与之匹配的订阅。之后才加入的订阅永远看不到这条消息,没有任何订阅匹配的消息就此消失。这就是至多一次投递:服务器既不保存什么,也不结算什么。
队列组分担工作。服务器把每条消息交给组内的一个成员,组外的订阅仍然收到属于自己的一份。组只由名字标识,所以用同一个名字订阅不同 subject 的成员也属于同一个组。
请求是一次给出了应答 subject 的发布,这个 subject 是请求方事先订阅的 inbox。响应方把应答发布到那里。没有任何订阅匹配的请求会立即得到 "no responders" 应答,因此请求方不必等到超时。
从 NATS 2.2 起,消息可以携带消息头。消息头的名字是不含冒号的可打印 ASCII 字符,值只有一行。超过载荷上限的消息会被服务器拒绝,默认上限是 1 MiB。
这一模型就是 NATS 服务器自己的模型(subject、发布-订阅、队列组和请求-应答)。流如何保存消息,见流;消费者如何读取它们,见消费者。