钉钉自定义机器人默认每分钟最多发送 20 条消息到同一个群,一旦超限会被限流 10 分钟,建议通过合并消息或使用多个机器人来规避。
先说结论:单机器人单群每分钟限 20 条,超限封禁 10 分钟,生产环境务必做聚合或轮询。
- 先确认:检查当前发送频率是否接近 20 条/分钟阈值。
- 先做:代码层增加消息队列,将多条告警合并为一条 Markdown 发送。
- 再验证:观察日志中是否有因限流导致的发送失败或延迟。
快速处理思路
由于这是 API 调用限制,没有直接的 shell 命令可解,需要在业务代码层面做调整。核心思路是“攒批发送”和“多路分流”。
1. 消息聚合:不要每条告警都调一次接口。在代码里维护一个缓冲队列,比如每 5 秒或攒够 5 条消息,打包成一个 Markdown 文本一次性发送。
2. 多机器人轮询:如果业务量确实大,创建多个机器人 Webhook,在代码里轮流使用不同的 access_token 发送,分散压力。
3. 降级策略:捕获接口返回的错误码,一旦发现限流,暂停发送并写入本地日志或备用存储,待限流期过后再补发或丢弃非关键消息。
为什么会这样
这个限制主要是为了保证群成员的使用体验及系统稳定运行。钉钉官方文档明确说明,消息发送太频繁会严重影响群的使用体验。限制是针对“一个机器人和一个群的组合”进行的,不会对其他机器人或群产生影响。如果你在一个群里高频刷屏,不仅会被接口限流,还可能被群成员屏蔽或投诉。
分步处理
步骤一:检查当前频率
查看你的监控告警系统日志,统计每分钟调用钉钉 Webhook 的次数。如果接近 20 次,必须立即优化。
步骤二:实现消息合并
修改发送逻辑,将文本消息改为 Markdown 格式。例如,将 10 条 CPU 告警合并为一条包含表格的摘要消息。注意消息文本长度目前有 4000 字符上限,合并时不要超限。
步骤三:配置多机器人(可选)
在钉钉群设置中添加多个自定义机器人,获取多个 Webhook 地址。在代码中维护一个 Token 列表,发送时依次切换使用。
步骤四:增加错误处理
在 HTTP POST 请求后检查响应状态。如果收到限流相关错误,触发休眠逻辑,避免连续请求导致限流时间延长。
怎么验证是否生效
1. 观察群消息:发送测试告警,确认消息能正常到达,且没有频繁刷屏。
2. 检查日志:查看应用日志,确认没有频繁的接口调用失败记录。
3. 压力测试:在测试环境模拟高频发送(如每分钟 30 条),确认合并逻辑生效后,实际接口调用次数降至 20 次以内。
常见坑
1. 字符数超限:合并消息时容易忽略 4000 字符的上限,导致发送失败。长文本需截断或分页。
2. Webhook 泄露:Webhook 地址相当于密码,不要提交到代码仓库或公布在外部网站,泄露后有安全风险。
3. 限流范围误解:限流是单群单机器人的。如果你把同一个机器人拉到 10 个群,每个群都可以发 20 条/分钟;但如果在 1 个群里用 1 个机器人发超过 20 条,就会触发限流。
4. 编码问题:发起 POST 请求时,必须将字符集编码设置成 UTF-8,否则中文可能乱码。
参考来源
- 钉钉开放平台 - 自定义机器人发送群消息:https://open.dingtalk.com/document/orgapp/custom-robots-send-group-messages
- 钉钉开发者社区 - 钉钉机器人限流问题问答
- 钉钉效率配方库 - 钉钉机器人消息发送频率限制说明