微信小程序对 WebSocket 的发送频率**没有公开的官方明确数值限制**,但存在**隐式的系统限流机制**(基于服务器压力、网络稳定性等动态调整),且结合开发者实践和微信官方的间接指引,可总结出「安全发送范围」和「限流触发阈值」,避免因频率过高导致发送失败、连接断开或小程序被限制。
### 一、核心结论(开发者实践共识)
#### 1. 安全发送频率(推荐)
- **文本消息**:每秒发送 ≤ 5-10 条(单条消息大小 ≤ 1024KB,建议 ≤ 50KB 更稳定)。
- **二进制消息**:每秒发送 ≤ 3-5 条(单条大小 ≤ 4MB,微信官方明确限制二进制消息最大 4MB)。
- 连续发送时,建议每条间隔 ≥ 100ms(避免短时间内“批量轰炸”)。
#### 2. 限流触发阈值(易触发限制的场景)
- 短时间内高频发送(如每秒 ≥ 20 条),会出现 `wx.sendSocketMessage` 回调 `fail`,错误信息可能为 `send fail` 或 `network error`。
- 连续发送超 100 条未间隔,可能被系统判定为“恶意请求”,直接关闭 WebSocket 连接(`onSocketClose` 触发,`code` 可能为 1006 或其他系统错误码)。
- 单条消息过大(文本超 1MB、二进制超 4MB),会直接发送失败,且可能触发连接不稳定。
### 二、微信官方的间接限制说明
微信小程序官方文档未明确“发送频率数值”,但有以下关键限制说明,间接决定了发送频率的安全范围:
1. **消息大小限制**:
- 文本消息:默认支持最大 1024KB(1MB),超出会发送失败。
- 二进制消息:最大 4MB(需通过 `ArrayBuffer` 发送,超出直接报错)。
2. **网络请求整体限制**:
微信小程序对所有网络请求(包括 WebSocket)有“并发数限制”(默认单个域名并发 ≤ 10 个),虽 WebSocket 是长连接,但若短时间内发送大量消息,会占用网络资源,间接触发限流。
3. **安全机制**:
微信会对“高频、无意义的 WebSocket 消息”进行风控,判定为恶意行为时,会限制该小程序的 WebSocket 功能(临时或永久)。
### 三、如何避免触发限流?(结合之前的频率控制方案)
1. **严格控制发送频率**:
- 按推荐的“每秒 ≤ 5-10 条”设计,使用「节流」「消息队列」控制速率(如每条间隔 100-300ms)。
- 批量数据拆分发送(如 100 条消息分 10 秒发送,每秒 10 条)。
2. **优化消息体积**:
- 文本消息:JSON 数据精简字段,避免冗余(如用缩写键名、删除无用参数)。
- 批量数据合并:将多条小消息合并为一条(如批量同步数据时,数组打包发送,而非单条循环)。
3. **监听发送失败,动态调整**:
若 `wx.sendSocketMessage` 触发 `fail`,可延迟重试(如 1-3 秒后重试),并临时降低发送频率:
```javascript
function sendWithRetry(data, retryCount = 3) {
wx.sendSocketMessage({
data: JSON.stringify(data),
fail: (err) => {
console.error('发送失败,重试中...', err);
if (retryCount > 0) {
// 失败后延迟 2 秒重试,降低频率
setTimeout(() => sendWithRetry(data, retryCount - 1), 2000);
}
}
});
}
```
4. **避免重复发送**:
用状态标记(如 `isSending`)或消息去重(如唯一 ID),防止同一消息多次发送,占用发送额度。
### 四、特殊场景的频率适配
1. **实时通信场景**(如聊天、实时数据推送):
- 文本消息:每秒 ≤ 5 条,单条 ≤ 50KB,足够满足日常聊天需求(人正常打字速度远低于此)。
2. **批量同步场景**(如同步历史数据):
- 用消息队列按“每秒 3-5 条”匀速发送,且每发送 20-30 条后,暂停 1-2 秒,避免持续高频。
3. **高频数据采集场景**(如传感器数据):
- 数据采样后合并发送(如每 500ms 合并一次数据,而非每次采样都发送),降低发送次数。
### 总结
微信小程序 WebSocket 无公开的“官方频率数值限制”,但实践中需遵循「每秒 ≤ 5-10 条文本消息、≤ 3-5 条二进制消息」的安全范围,且单条消息不超过对应大小限制。核心原则是:**避免短时间内高频、大量发送,通过队列、节流、合并消息等方式匀速发送**,同时监听发送状态,动态调整速率,即可避免触发系统限流。