# 基于主题的消息

2,857 / 5,000 翻译结果

## 基于主题的消息传递

从根本上说，NATS 是关于发布和侦听消息的。这两者都严重依赖于\_Subjects\_。

**什么是主题？** 在最简单的情况下，主题只是形成名称的字符串，发布者和订阅者可以使用该名称来查找对方。它有助于将消息范围限定为流或主题。

![](https://1597084071-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFSFNeUzuhP1a7Pu5L4Vm%2Fuploads%2Fgit-blob-dc7b8771a8a77c9042d216ca3868ec0fa7b05fff%2Fsubjects1.svg?alt=media)

#### 主题名称允许使用字符

为了跨客户端的兼容性，我们建议使用 ASCII 字符（将来可能会更改）。

**推荐字符：** `a` 到 `z`、`A` 到 `Z` 和 `0` 到 `9`（名称区分大小写，不能包含空格）。 \*\*特殊字符：\*\*句点`.`（用于分隔主题中的标记）和`*`以及`>`（`*`和`>`用作通配符）。 **保留的主题名称：** 按照惯例，以 `$` 开头的主题名称保留给系统使用（例如，以 `$SYS` 或 `$JS` 或 `$KV` 开头的主题名称等...）

### 主题层次结构

`.` 字符用于创建主题层次结构。例如，世界时钟应用程序可能会定义以下内容以对相关主题进行逻辑分组：

```markup
time.us
time.us.east
time.us.east.atlanta
time.eu.east
time.eu.warsaw
```

### 通配符

NATS 提供了两个 *通配符*，它们可以代替点分隔主题中的一个或多个元素。**订阅者可以使用**这些通配符通过单个订阅收听多个主题，但**发布者**将始终使用完全指定的主题，而**不**使用通配符。

#### 匹配单个标记

第一个通配符是 `*`，它将匹配单个标记。例如，如果应用程序想要监听东部时区，他们可以订阅 `time.*.east`，这将匹配 `time.us.east` 和 `time.eu.east`。

**译者注 单个标记，不是单个字母**

![](https://1597084071-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFSFNeUzuhP1a7Pu5L4Vm%2Fuploads%2Fgit-blob-b70adb26feafc88e119d7455639c57bb82bba9a4%2Fsubjects2.svg?alt=media)

#### 匹配多个标记

第二个通配符是`>`，它将匹配一个或多个标记，并且只能出现在主题的末尾。例如，`time.us.>` 将匹配 `time.us.east` 和 `time.us.east.atlanta`，而 `time.us.*` 只会匹配 `time.us.east`，因为它不能匹配多个令牌。

![](https://1597084071-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFSFNeUzuhP1a7Pu5L4Vm%2Fuploads%2Fgit-blob-e73c731e2444069e3aedf8e14a6cd6bb8aced13d%2Fsubjects3.svg?alt=media)

#### 监控和分接头

根据您的安全配置，通配符可用于通过创建有时称为 *分接头* 的东西进行监控。在最简单的情况下，您可以为`>` 创建一个订阅者。此应用程序将在安全设置的限制下接收在您的 NATS 集群上发送的所有消息。

#### 混合通配符

通配符 `*` 可以在同一主题中出现多次。两种类型都可以使用。例如，`*.*.east.>` 将收到 `time.us.east.atlanta`。

### 主题标记

建议将主题中的最大标记数保持在最大 16 个的合理值。
