API 使用限制

更新时间不可用

本文适用于 RTM 2.x 客户端 SDK 和 RESTful API,介绍各层级的使用限制、超出限制后的行为,以及容量规划时的估算方法。

微信小程序适用范围

微信小程序支持 Message Channel 和 User Channel,以及 Presence、Storage、Lock 和 Token 等已支持能力。本文中所有与 Stream Channel 和 Topic 相关的配额、消息规格、示例及调优建议对微信小程序均不适用;其余限制请按小程序已支持的功能使用。

快速导航

使用场景参考章节
调用返回了限频错误调用频率限制
发送失败,提示消息过长或参数超限消息规格
频道人数增加后延迟上升、用户反复重连频道消息速率建议值、场景示例
上线前估算容量PCU 估算、频道消息速率建议值、场景示例
想申请提高某个上限申请提升与提前沟通
表格内容超出当前宽度,可横向滚动查看更多列。

限制层级

RTM 的限制分为四层。上层限制约束总量,下层限制约束单个对象;同一次调用可能同时受到多层限制。

层级作用对象超出后怎么发现章节
账号级你的声网账号RESTful API 返回配额错误第 1 章
项目级(App ID)单个项目多数为建议值,超出前需联系技术支持第 2 章
频道级单个频道容量类返回错误;速率类为建议值第 3 章
客户端级单个 RTM 客户端实例SDK 错误回调第 4 章
表格内容超出当前宽度,可横向滚动查看更多列。

限制类型

类型含义超出后可否调整
固定上限系统硬性约束调用失败并返回错误否
默认上限默认配额调用失败并返回错误可申请提升,见第 9 章
建议值在此范围内可获得最佳性能通常不报错建议超出前联系技术支持
不限数量资源数量不设上限—不代表容量无限,仍受速率和吞吐约束
表格内容超出当前宽度,可横向滚动查看更多列。

1. 账号级限制

限制项数值类型说明
RESTful API 总调用速率 / 账号1000 次/秒默认上限账号下所有项目、所有 RESTful API 合计;超出返回 HTTP 429。
表格内容超出当前宽度,可横向滚动查看更多列。

2. 项目级限制(App ID)

限制项数值类型说明
峰值同时在线用户数(PCU)20 万建议值预计超过时请提前联系技术支持。估算方法见2.1。
总上行消息速率10 万条/秒建议值项目下所有客户端和 RESTful API 发送量合计。
Message Channel 数量不限数量不限数量频道随用随取,无需预先创建。
Stream Channel 数量不限数量不限数量频道随用随取,无需预先创建。
Channel Metadata 总量100 万建议值预计超过时请提前联系技术支持。
User Metadata 总量100 万建议值预计超过时请提前联系技术支持。
Lock 总量100 万建议值预计超过时请提前联系技术支持。
历史消息存储时长1、7、30、90、365 天或永久默认上限在控制台按项目配置。已写入消息的保存时长不受后续配置影响。
表格内容超出当前宽度,可横向滚动查看更多列。

2.1 怎么估算你的 PCU

RTM 的限制和计费都以 PCU 为单位,而业务指标通常只有 DAU、房间数或课堂数。按业务形态选择对应的估算方法:

业务形态你已有的数据PCU 估算公式
IM / 社交DAU、用户日均在线时长PCU ≈ DAU × 日均在线时长 ÷ 24 小时 × 峰值系数
直播 / 秀场同时开播房间数、单房间平均观众数PCU ≈ 同时开播房间数 × 单房间平均观众数 × 峰值系数
教育 / 会议同一时段的课堂数、每场人数PCU ≈ 同一时段课堂数 × 每场人数
游戏同时在线玩家数(CCU)PCU ≈ CCU
表格内容超出当前宽度,可横向滚动查看更多列。

峰值系数用于把日均值放大到峰值时段,经验上取 2–3。有明确活动峰值的业务(例如大促、赛事、开学)请直接按活动峰值估算,不要使用日均值。

常见的估算偏差包括:

  • 多端登录按多个连接计。同一用户同时在手机和网页登录时,PCU 计 2。
  • heartbeatInterval 会影响 PCU。心跳间隔越长,掉线用户被判定离线越慢,统计出的 PCU 越偏高。默认值为 5 秒,范围为 5–1800 秒。

3. 频道级限制

3.1 容量

限制项数值类型说明
Message Channel 订阅者数(未开启 Presence)不限数量不限数量仍受3.2 的消息速率建议值约束。
Message Channel 订阅者数(开启 Presence)5000 人建议值预计超过时请提前联系技术支持。
Message Channel 发布者数不限数量不限数量—
Stream Channel 在线用户数128 人固定上限第 129 人 join 失败并返回错误码。需要更大规模时使用多个 Stream Channel 或改用 Message Channel。
Stream Channel 内 Topic 数不限数量不限数量Topic 随首个发布者加入创建,最后一个发布者离开后销毁。
频道内锁数量32 把建议值预计超过时请提前联系技术支持。
表格内容超出当前宽度,可横向滚动查看更多列。

小程序不支持 Stream Channel,因此不适用上表中的 Stream Channel 在线用户数和 Topic 数限制;其他 Message Channel 和锁限制适用。

3.2 频道消息速率建议值

频道消息速率是每秒内所有发布者(客户端和 RESTful API)向同一个频道发送的消息总条数。它是频道级限制,与第 4 章的客户端级限频分别计算:每个客户端都没有超限时,频道合计仍可能超出建议值。

建议值随频道同时在线人数分档。人数越多,每条消息的扇出成本越高,频道能承受的速率越低。

单个频道同时在线人数频道消息速率建议上限
< 1,000200 条/秒
1,000–10,000100 条/秒
≥ 10,00030 条/秒
表格内容超出当前宽度,可横向滚动查看更多列。

超出后的表现:通常不报错,但延迟可能增加,消息可能丢失,用户可能无法收发消息或反复重连。

接近建议值时:

  • 按用户分片到多个频道,每个频道独立对照上表。
  • 高频小消息改用 Stream Channel + Topic(单频道不超过 128 人)。
  • 在业务服务端聚合后通过 RESTful API 发送,减少上行条数。
  • 需要更高速率时提前联系技术支持,可在不影响延迟和稳定性的前提下定制提升。

4. 客户端级限制

以下限制均以单个 RTM 客户端实例为统计单位,多个客户端各自独立计算。

4.1 调用频率限制

RTM 将客户端 API 按功能分为若干操作类别,每个类别拥有独立的每秒调用配额。同一类别内的方法共享配额,不同类别之间互不影响。例如,同一秒内调用 15 次 whoNow 和 15 次 getChannelMetadata 不会触发限频,因为它们属于不同类别;但同一秒内调用 25 次 whoNow 会触发限频。

超出配额的调用不会被执行,也不会排队。SDK 通过错误回调返回限频错误码,需要在业务层节流或退避后重试,见第 8 章。

有特殊配额的操作

操作类别方法配额 / 客户端类型说明
发送消息publish60 次/秒默认上限Message Channel 与 User Channel 共用这 60 次。
发送 Topic 消息publishTopicMessage200 次/秒,按单个 Stream Channel 计默认上限同一客户端加入多个 Stream Channel 时各自独立,不占用其他类别配额。
修改频道属性setChannelMetadata、updateChannelMetadata、removeChannelMetadata20 次/秒默认上限—
读取频道属性getChannelMetadata20 次/秒默认上限—
修改用户属性setUserMetadata、updateUserMetadata、removeUserMetadata20 次/秒默认上限—
读取用户属性getUserMetadata20 次/秒默认上限—
获取锁acquireLock10 次/秒默认上限—
表格内容超出当前宽度,可横向滚动查看更多列。

其余操作:每个类别各 20 次/秒

下表每一行是一个独立类别,行内的方法共享该类别的 20 次/秒配额。

类别方法
登录login
更新 TokenrenewToken
订阅 Message Channelsubscribe
加入 Stream Channeljoin、leave
加入 TopicjoinTopic、leaveTopic
订阅 TopicsubscribeTopic
订阅用户属性subscribeUserMetadata
查询频道在线用户whoNow
查询用户所在频道whereNow
修改临时状态setState
读取临时状态getState
设置锁setLock
删除锁removeLock
释放锁releaseLock
撤销锁revokeLock
查询锁getLocks
获取历史消息getMessages
表格内容超出当前宽度,可横向滚动查看更多列。

4.2 连接与实例

限制项数值类型超出后
RTM 实例数 / 客户端1 个固定上限创建第 2 个实例失败。
userId 长度64 个 ASCII 字符固定上限初始化或登录失败。
同时订阅 Message Channel 数50 个默认上限第 51 次 subscribe 失败并返回错误码。
同时加入 Stream Channel 数10 个默认上限第 11 次 join 失败并返回错误码。
同时加入 Topic 数 / 频道8 个固定上限第 9 次 joinTopic 失败。
同时订阅 Topic 数 / 频道50 个固定上限第 51 次 subscribeTopic 失败。
订阅发布者数 / Topic64 个固定上限不传 users 时随机订阅至多 64 个发布者,超出的发布者消息收不到。
表格内容超出当前宽度,可横向滚动查看更多列。

4.3 消息规格

限制项数值类型超出后
消息包体积(Message / User Channel)32 KB默认上限发送失败,错误码 -11010。体积 = 消息负载 + customType。
消息包体积(Topic)1 KB默认上限发送失败,错误码 -11010。计算方式同上。
customType 长度32 个 ASCII 字符固定上限发送失败。
频道名长度64 个 ASCII 字符固定上限调用失败;另受合法字符集约束,参见频道命名指南。
Topic 名长度16 个 ASCII 字符固定上限调用失败。
getMessages 单次条数100 条固定上限超出部分需翻页获取。
getMessages 查询窗口start 与 end 间隔不超过 24 小时固定上限调用失败并返回错误码。
表格内容超出当前宽度,可横向滚动查看更多列。

4.4 Presence 规格

限制项数值类型超出后
presenceTimeout默认 300 秒,范围 5–300 秒固定范围不报错,就近取边界值。例如传 400 秒时按 300 秒生效。
临时状态键值对数 / 用户 / 频道32 对固定上限setState 失败。
临时状态单个 value 大小16 KB固定上限setState 失败。
临时状态 key 长度32 个 ASCII 字符固定上限setState 失败。
加入频道前可缓存的临时状态数100 个固定上限加入或订阅后才生效并触发通知。
whoNow 单页人数100 人固定上限通过 nextPage 翻页。
实时通知最大人数(Announce → Interval 切换阈值)默认 50 人,控制台可设 8–128 人默认上限在线人数达到阈值后,事件由实时通知改为周期聚合通知。
表格内容超出当前宽度,可横向滚动查看更多列。

4.5 Storage 规格

限制项数值类型超出后
Metadata Item key 长度32 个 ASCII 字符固定上限调用失败。
Metadata 组数 / 频道或用户1 组固定上限—
Metadata Item 数 / 组不限数量不限数量仍受整组 16 KB 约束。
单组 Metadata 大小16 KB默认上限写入失败。
单个 Metadata Item 大小16 KB默认上限写入失败;与整组 16 KB 同时生效。
表格内容超出当前宽度,可横向滚动查看更多列。

Metadata 写入后会长期保存,频道销毁或用户注销不会自动删除;不再需要时请显式删除。

4.6 Lock 规格

限制项数值类型超出后
同时持有锁数 / 客户端不限数量不限数量—
锁 TTL默认 10 秒,范围 10–300 秒固定范围不报错,就近取边界值。TTL 只在持有者掉线后开始计时;TTL 内重连回来仍持有锁,超时自动释放并触发事件。
锁名长度64 个 ASCII 字符固定上限调用失败。
表格内容超出当前宽度,可横向滚动查看更多列。

5. RESTful API 限制

限制项数值类型说明
账号总调用速率1000 次/秒默认上限返回 HTTP 429,见第 1 章。
publish 单频道速率不单独设限—RESTful API 发送量与客户端发送量一起计入3.2 的频道消息速率。
publish 消息包体积32 KB固定上限超出会报错。
publish 请求体可序列化字符串固定上限不支持二进制请求体;二进制内容请先进行 Base64 编码。
History 查询速率60 次/秒建议值超出返回配额错误。
History 单次条数100 条固定上限超出部分翻页获取。
表格内容超出当前宽度,可横向滚动查看更多列。

6. 场景示例:怎么对照 3.2 做规划

频道消息速率 ≈ 频道内活跃发布者数 × 人均每秒发送次数。先估算这个值,再对照3.2 的分档表。分档表第一列是同时在线人数(决定扇出成本),第二列是发送速率,两者分别估算。

以下规模数字仅为演示,请用真实埋点数据替换:

场景示例规模估算速率对照 3.2推荐做法
IM 群聊500 人群,活跃时 5% 的人每 10 秒发 1 条500 × 5% ÷ 10 ≈ 2.5 条/秒< 1,000 人档,上限 200,余量充足使用 Message Channel;开启 Presence 时注意 5000 人建议值。
直播间弹幕5 万观众,1% 的人每 5 秒发 1 条50,000 × 1% ÷ 5 = 100 条/秒≥ 10,000 人档,上限 30,超出 3 倍以上在业务服务端聚合,每秒合并为不超过 30 条后通过 RESTful API 下发,或按观众分片到多个频道;礼物等低频高价值消息单独使用一个频道。
直播间礼物 / 系统通知5 万观众,每秒不超过 5 条5 条/秒≥ 10,000 人档,上限 30,可承受与弹幕分频道,避免被弹幕挤占。
多人游戏状态同步100 人房间,每人每秒 10 次位置上报1,000 条/秒Message Channel 任何档位都超出使用 Stream Channel + Topic;单频道不超过 128 人,每个发布者不超过 200 次/秒,接收端按需订阅不超过 64 个发布者。
IoT 设备上报2,000 台设备,每台每 5 秒上报 1 次400 条/秒1,000–10,000 人档,上限 100,超出 4 倍按设备分组到至少 5 个频道,每频道不超过 400 台、80 条/秒。
协同编辑 / 白板20 人协作,每人每秒 20 次笔画事件400 条/秒< 1,000 人档,上限 200,超出 2 倍使用 Stream Channel + Topic;Topic 消息不超过 1 KB,客户端合并 50 毫秒内的笔画后再发送。
表格内容超出当前宽度,可横向滚动查看更多列。

两个提醒:

  • 活跃比例和人均频率对结果影响最大,优先用真实数据替换示例值。
  • 分档表描述的是单个频道;分片后每个频道独立对照分档表,但项目级总上行速率(10 万条/秒,第 2 章)仍按所有频道合计。

7. 常见问题

8. 超出限制后怎么办

超限类型怎么发现要不要重试建议做法
客户端类别配额超限(4.1)SDK 错误回调,限频错误码要业务层做队列节流,指数退避后重试;不要在回调里立即重发。
容量类固定上限(体积、长度、数量)SDK 错误回调,例如 -11010 消息过长不要修正参数后再调用;发送前本地校验体积。
参数范围类(presenceTimeout、锁 TTL)不报错,SDK 就近取边界值—按文档范围传值,不要依赖截断行为。
频道消息速率建议值(3.2)不报错;延迟大幅上升,用户无法收发或反复重连—按 3.2 分片频道或改用 Stream Channel;需要更高值时联系技术支持。
项目级建议值(PCU、总上行速率)不报错—预计超过时提前联系技术支持。
RESTful API 配额超限HTTP 响应返回配额错误要服务端限流并进行退避重试。
表格内容超出当前宽度,可横向滚动查看更多列。

限频错误的重试模式(各平台 SDK 的回调形式见对应 API 参考):

Text
send(msg):
  result = rtm.publish(channel, msg)
  if result.error == RATE_LIMITED:
    delay = min(baseDelay * 2 ** attempt, maxDelay)  // 100 ms 到 2 s
    wait(delay)
    attempt += 1
    if attempt < maxAttempts:
      send(msg)
    else:
      report("publish dropped after retries")
  else:
    attempt = 0

更稳妥的做法是在发送侧维护一个按类别的令牌桶(发消息 60 次/秒、其他类别 20 次/秒),从源头避免触发限频,而不是依赖重试。

9. 申请提升与提前沟通

以下项目可以申请提升或需要提前沟通。请联系 rtm-support@agora.io 或技术支持,并附上 App ID、预计规模和上线时间:

项目默认值类型
RESTful API 总调用速率 / 账号1000 次/秒申请提升
PCU / 项目20 万超出前提前沟通
总上行消息速率 / 项目10 万条/秒超出前提前沟通
开启 Presence 的频道订阅人数5000 人超出前提前沟通
频道消息速率见 3.2 分档表可定制提升
同时加入 Stream Channel 数 / 客户端10 个申请提升
同时订阅 Message Channel 数 / 客户端50 个申请提升
publish 速率 / 客户端60 次/秒申请提升
publishTopicMessage 速率 / 客户端 / 频道200 次/秒申请提升
消息包体积32 KB / 1 KB申请提升
单组 Metadata 大小16 KB申请提升
频道内锁数量32 把申请提升
Lock 总量 / 项目100 万申请提升
表格内容超出当前宽度,可横向滚动查看更多列。