Topic Names and Topic Filters
Topic wildcards
Topic Name 和 Topic Filter 的区别就是 Topic Name 不能包含通配符,而 Topic Filter 可以包含通配符。
Topic Name 标识一个具体的主题,而 Topic Filter 可以标识一个或者一组主题。
Topic level separator
主题级别分隔符 (topic level separator), 用 /
标识。
/
用于将结构引入主题名称中。 如果出现主题级别分割符,它将一个字符串的主题名称分割为多个“主题级别”。
两个相邻的/
标识一个长度为零的主题级别。
它的作用就像文件路径中的路径分隔符。
Multi-level wildcard
多级通配符 (multi-level wildcard), 用 #
标识。
匹配任意多级别的主题, 包括它的父层级和所有子层级。
这个通配符可以单独使用或者跟在主题级别分隔符之后, 而且它必须是当前 Topic filter 的最后一个字符。
例如:
比如一个客户端订阅了主题 "sport/tennis/player1/#", 那么下面这些主题都会被匹配上:
- "sport/tennis/player1"
- "sport/tennis/player1/ranking"
- "sport/tennis/player1/score/wimbledon"
- "sport/#" 与 “sport” 主题也匹配,因为 "#" 可以匹配父层级。
- "#" 也是合法的,它匹配所有的主题。
- "sport/tennis/#" 也是合法的
- "sport/tennis#" 是非法的
- "sport/tennis/#/ranking" 是非法的
Single level wildcard
单级通配符(single level wildcard), 用 +
标识。
匹配单个级别的主题。
可以在任意级别中使用这个通配符。
但是它必须独占当前主题级别。
可以在一个topic filter 中多次使用这个通配符。
可以和多级通配符搭配使用。
例子:
"sport/tennis/+"
匹配 "sport/tennis/player1" 和 "sport/tennis/player2",
不匹配 "sport/tennis/player1/ranking" (因为单级通配符只能匹配一个层级,而这里在 tennis 之后有两个层级)
"sport/+" 不匹配 "sport", 但是匹配 "sport/"
- "+" 是合法的
- "+/tennis/#" 是合法的
- "sport+" 是非法的
- "sport/+/player1" 是合法的
- "/finance" 匹配 "+/+" 和 "/+", 但是不匹配 "+"
Topics beginning with $
服务器不应该将以通配符开始的 topic filter 与以 $
开头的 topic name 进行匹配。
服务器应该阻止客户端通过这些 topic 与其他客户端交换消息。
服务器应该使用以 $ 开头的 topic 做其他用途。
比如:以 $SYS/ 开头的主题被广泛的用于提供服务器特定的信息或者控制 API
例子:
- 订阅主题 "#" 的客户端不会收到那些被发布到以$开头的 topic 中的消息。
- 订阅主题 "+/monitor/Clients" 的客户端不会收到那么些被发布到以 "$SYS/monitor/Clients" 主题中的消息。
- 订阅主题 "$SYS/#" 的客户端会收到那些被发布到以 "$SYS/" 开头的主题中的消息
- 订阅主题 "$SYS/monitor/+" 的客户端会收到那些被发布到以 "$SYS/minitor/Clients" 主题中的消息
- 如果客户端想同时收到所有以 $SYS/ 开头的和非 $ 开头的主题中的消息,那么它必须同时订阅主题 "#" 和 "$SYS/#"
Topic semantic and usage
如下规则被应用到 topic name 和 topic filter:
- topic name 和 topic filter 的长度至少为 1.
- topic name 和 topic filter 是大小写敏感的
- topic name 和 topic filter 中可以包含空白字符
- 前缀,后缀 / 标识一个不同的 topic name 或者 topic filter
- 只包含一个 “/” 字符的 topic name 和 topic filter 是合法的
- topic name 和 topic filter 中不能包含空字符(null character, Unicode U+0000)
- topic name 和 topic filter 使用 UTF-8 编码,编码之后的长度不能超过 65535.
- topic name 和 topic filter 的层级可以无限深,没有限制