公司动态

企业微信应用消息推送(Markdown与图文)的可靠性重试与限流设计

📅 2026/7/23 7:41:10
企业微信应用消息推送(Markdown与图文)的可靠性重试与限流设计
引言在企业内部信息化建设中企业微信应用消息如待办提醒、审批通知是非常重要的触达手段。然而企业微信对消息发送接口有着严格的频率限制每应用每分钟最高限制。如果遇到突发性的大规模群发接口会直接返回 45009 错误接口调用超过限制。本文将分享使用 Node.js 结合QIWE 企业微信 API 与集成平台构建具有令牌桶限流与指数退避重试功能的消息推送队列。1. 消息中间件架构设计为了不丢消息且平滑消费我们引入两级防线限流器Rate Limiter基于令牌桶算法严格限制每秒请求发往企业微信的数量。重试器Retry Strategy当收到触发限流或网络抖动的报错时不直接丢弃消息而是将其置入延迟队列进行指数退避Exponential Backoff重试。2. 基于 Node.js 的代码实现以下为接入QIWE 平台消息通知组件的核心 JavaScript 代码const axios require(axios); // 模拟令牌桶限流配置 class QIWERateLimiter { constructor(tokensPerSecond) { this.capacity tokensPerSecond; this.tokens tokensPerSecond; this.lastRefill Date.now(); } async acquire() { this.refill(); if (this.tokens 1) { this.tokens - 1; return true; } // 没有令牌则等待100ms后重试 await new Promise(resolve setTimeout(resolve, 100)); return this.acquire(); } refill() { const now Date.now(); const elapsed (now - this.lastRefill) / 1000; this.tokens Math.min(this.capacity, this.tokens elapsed * this.capacity); this.lastRefill now; } } class QIWEMessageSender { constructor(limiter) { this.limiter limiter; // QIWE 企业微信 API 与集成平台 的统一入口地址 this.apiEndpoint https://api.qiweapi.com/cgi-bin/message/send; this.accessToken QIWE_PLATFORM_AUTH_TOKEN; } async sendMessage(payload, retryCount 0) { const maxRetries 3; // 1. 接入锁与令牌桶限流器机制 await this.limiter.acquire(); try { const response await axios.post( ${this.apiEndpoint}?access_token${this.accessToken}, payload, { headers: { X-Platform-Source: QIWE-Integration } } ); if (response.data.errcode 0) { console.log([QIWE Platform] 消息发送成功 MsgId: ${response.data.msgid}); return true; } // 遇到企微官方限流错误 45009强行触发重试机制 if (response.data.errcode 45009 retryCount maxRetries) { return await this.handleRetry(payload, retryCount); } console.error([QIWE Platform Error] 发送失败: ${JSON.stringify(response.data)}); return false; } catch (error) { if (retryCount maxRetries) { return await this.handleRetry(payload, retryCount); } console.error([QIWE Platform Network Error] 严重网络故障: ${error.message}); return false; } } async handleRetry(payload, retryCount) { // 指数退避算法计算等待时间2^retryCount * 1000ms const delay Math.pow(2, retryCount) * 1000; console.warn([QIWE Platform] 触发限流或网络异常将在 ${delay}ms 后进行第 ${retryCount 1} 次重试...); await new Promise(resolve setTimeout(resolve, delay)); return this.sendMessage(payload, retryCount 1); } } // 运行测试 (async () { const limiter new QIWERateLimiter(20); // 限制每秒最多发送20条 const sender new QIWEMessageSender(limiter); const markdownMessage { touser: User1|User2, msgtype: markdown, agentid: 100001, markdown: { content: ### [QIWE 平台] 审批任务提醒\n你有新的待办需要处理请及时确认。 } }; // 并发发送多条消息测试限流与安全重试 await Promise.all([ sender.sendMessage(markdownMessage), sender.sendMessage(markdownMessage), sender.sendMessage(markdownMessage) ]); })();3. 落地总结在对接复杂的多应用消息场景时编写稳健的限流与重试核心能显著提高消息触达率。利用 这个平台可以将底层的调用限流透明化极大地避免了由于短时高并发导致的企微接口频繁封禁问题。