频道基础
在 RTM 实时网络中,频道是一种有效的数据传输管理机制,用于将数据从一个设备传递到另一个设备。任何订阅或加入频道的用户都可以在 100 毫秒内接收到该频道中传输的消息或事件。RTM 允许客户端同时订阅或加入多个频道,具体数量参考 API 使用限制。大多数 RTM API 都使用频道作为参数,包括发送消息、接收消息、加密等。
频道类型
RTM 的频道分为两种类型,分别是 Message 和 Stream,在 API 中通过 RTM_CHANNEL_TYPE
加以区别。两种频道的主要区别如下:
频道类型 | 主要特征 | 适用场景 |
---|---|---|
Message | 遵循行业标准的 Pub/Sub (发布/订阅)模式投递消息和事件,频道无需提前创建,随用随取。频道内的发布者和订阅者数量没有上限,但对于单个频道的上行 QPS(Queries per second,每秒查询数)有限制,详见 API 使用限制。 | 常见的基于 Pub/Sub 场景的应用及多设备接入的应用,例如:IoT 行业的多设备管理和指令收发,智能设备中的多终端管理和指令收发位置跟踪,大型社区等。 |
Stream | 遵循行业类似观察者模式的 Room (房间)概念,用户需要加入频道才能收发事件通知。消息通过频道内的 Topic 进行管理和投递,单个频道最多允许 1000 个用户同时加入。支持与声网 RTC 音视频数据共频道、同步传输等。此外,还支持客户端消息以更高的 QPS 进行投递,详见 API 使用限制。 | 高频大并发数据传输场景以及与 RTC 音视频数据共频道、同步传输的场景,例如:元宇宙,平行驾驶,云游戏等。 |
可以认为频道是一种控制消息流动的管道。Message 和 Stream 频道在消息流的控制上采用了不同的策略:
- 在 Message 频道中,发布者只需要将消息投递到特定频道中,那么任何订阅该频道的设备或用户都可以收到该消息或事件通知。
- 在 Stream 频道中,用户不可以直接发送消息。用户需要先调用
JoinTopicAsync
方法注册成为该 Topic 的发布者,然后才可以发送消息,详见发送消息。如果用户要接收消息,则需订阅指定 Topic 中的特定消息发布者(通过用户 ID 标识),才能接收到该发布者发布的消息,详见 Topic 。
除消息以外,Message 频道和 Stream 频道对于 Presence、Storage、Lock 等其他事件通知的机制和用法是相同的。
创建频道
对于 Message Channel,在使用前,你无需提前定义或创建频道。在你首次向 Message Channel 发送消息或首次订阅 Message Channel 时,RTM 会为你自动创建该频道。
对于 Stream Channel,虽然本质上也是随用随取的,但在使用前你需要明确的调用 CreateStreamChannel
方法创建一个 IStreamChannel
对象实例,然后才能调用 JoinAsync
方法加入频道。
频道限制
RTM 对同时存在的 Message 和 Stream 频道数量没有限制。然而,不同频道对单个客户端同时订阅或加入的频道数量、收发消息的 QPS 等的限制不同,详见 API 使用限制。
频道名称
频道名称不能为空,可为长度不超过 64 字节的字符串,由 ASCII 字符集中的字母或数字组成。RTM 使用 App ID 作为频道的命名空间,每个 App ID 下的频道由频道名称和频道类型共同标识。如果两个频道的频道类型不同或频道名称不同,则 RTM 会将它们视为两个独立的频道;如果两个频道的频道类型和频道名称都相同,则 RTM 会将它们视为同一个频道。
非法字符
.
、*
、/
、\
、\0
和不可打印的 ASCII 字符都属于非法字符。
合法字符
支持的合法字符如下:
- 26 个小写英文字母 a~z
- 26 个大写英文字母 A~Z
- 10 个数字 0~9
- 空格
!
、#
、$
、%
、&
、(
、)
、+
、,
、-
、:
、;
、<
、=
、>
、?
、@
、[
、]
、^
、_
、{
、|
、}
、~
、`
命名不能以 _
为前缀。
命名约定
虽然 SDK 并未强制要求,但是声网建议你在为频道命名的时候,通过有意义的前缀字符来表征频道的业务用途或此频道中消息的类型等,以便于你更清晰地展示你的业务逻辑。点击命名推荐查看更多建议。