官网友情链接: wechatapi.net
个人微信二次开发进入多账号阶段以后,一个非常容易被忽略的问题是:账号之间到底应该隔离到什么程度。
在只有一个微信账号时,系统结构通常比较简单。消息进入同一个队列,文件进入同一个队列,自动回复、好友同步、微信群处理也都围绕同一个账号运行。
但当企业接入十个、几十个微信账号以后,如果仍然共享同一套没有隔离的任务资源,很容易发生一种情况:一个账号出现异常,整套微信自动化系统都跟着变慢。
例如某个账号突然积压 5 万条历史同步任务。另一个账号此时收到客户实时消息,本来应该几秒钟完成自动回复,却因为前面还有大量批任务而排队。
或者某个账号连续发生文件下载失败,大量失败重试不断占用 Worker,其他正常账号的任务也被拖慢。
这就是为什么多账号微信二次开发不能只做“账号列表”,还要做任务隔离。
WechatApi 可以作为个人微信API接入层,把不同微信账号的私聊、微信群、好友、文件和相关事件接入业务系统。但任务队列、失败重试、并发限制、异常隔离,需要本地系统围绕账号维度继续设计。
一、多账号最怕共享一个无边界队列
最简单的架构可能是:
所有消息任务 → queue_message;
所有文件任务 → queue_file;
所有同步任务 → queue_sync。
看起来已经按任务类型做了分类。
但如果账号 A 在 queue_sync 里突然产生 10 万任务,队列仍然可能被 A 占满。
账号 B、C 的同步任务只能在后面等待。
因此,多账号系统至少需要在任务中携带:
account_id。
调度器也要理解账号维度。
二、什么是账号级任务隔离
账号级任务隔离并不一定意味着每个账号真的创建一个物理队列。
更重要的是逻辑上做到:
每个账号有自己的并发额度;
自己的失败统计;
自己的暂停状态;
自己的积压数量;
自己的速率限制。
例如:
账号 A 最大并发 5;
账号 B 最大并发 3;
账号 C 当前暂停。
即使共享同一个底层队列,调度器也不能让 A 把所有执行资源占满。
三、实时消息和批量任务还要继续隔离
仅仅按账号隔离还不够。
同一个账号内部也存在任务优先级差异。
例如账号 A 同时有:
5000 条历史好友同步;
2000 条微信群成员同步;
1 条客户实时消息。
客户实时消息不能排在批任务后面。
所以可以进一步分成:
实时消息任务;
普通业务任务;
批量同步任务;
低优先级统计任务。
同一个账号内部也按照优先级执行。
四、一个具体例子
企业有 8 个微信账号。
其中账号 6 在凌晨执行历史群成员同步。
由于历史数据很多,产生 3 万条任务。
上午 9:20,账号 2 收到客户消息:
“昨天的问题还没解决。”
如果整个系统只有一个 FIFO 队列,客户消息可能排很久。
更合理的设计是:
账号 2 的实时消息进入 realtime 队列。
账号 6 的历史任务进入 batch 队列。
调度器保证实时队列优先。
同时账号 6 的批任务限制每秒固定执行量。
这样历史同步不会影响客户服务。
五、一个账号异常时应该只暂停这个账号
假设账号 A 连续发送失败。
系统判断:
账号健康度异常。
这时候正确动作应该是:
暂停账号 A 的新发送任务;
保留 A 的消息和任务;
通知管理员;
继续运行 B、C、D。
不能因为某个账号异常就停止整个 Worker。
这种隔离对于多账号微信机器人非常关键。
六、账号级熔断可以减少失败风暴
如果某个账号已经连续失败 20 次,再继续执行 1000 个任务只会制造更多失败。
可以设计账号熔断。
例如:
最近 1 分钟连续失败 10 次;
发送成功率低于 20%。
账号进入:
暂停状态。
暂停以后:
不再分配新的发送任务;
保留必要状态检测;
定期尝试恢复。
这样可以防止失败任务不断占用系统资源。
七、恢复以后也要渐进释放
账号恢复以后,可能已经积压大量任务。
不能瞬间全部释放。
可以分阶段:
第一阶段:只处理实时消息。
第二阶段:恢复普通任务。
第三阶段:逐步恢复批任务。
如果恢复期间再次失败,快速进入暂停。
这种渐进恢复比“账号上线=全部任务一起跑”稳定得多。
八、任务是否允许迁移账号必须明确
有些团队会想到:
账号 A 异常,就让账号 B 替它执行。
这个逻辑不能通用。
客户和哪个账号建立关系,本身就是业务关系。
客户原来一直跟账号 A 沟通,如果突然由账号 B 发消息,可能完全不符合业务预期。
所以任务可以增加:
allow_account_migration。
例如:
后台统计任务可以迁移。
某些公共资料处理任务可以迁移。
客户私聊回复通常不能迁移。
微信群任务还要看 B 是否存在于该群。
九、文件任务也需要账号隔离
文件下载可能非常耗资源。
某个账号突然收到大量视频或文件,不应该把全系统文件 Worker 打满。
可以设置:
每账号文件并发;
全局文件并发;
文件大小限制;
超时策略。
实时文本消息不应该被大文件任务影响。
十、好友同步和微信群同步最好独立限速
数据同步任务通常量大,但实时性要求没那么高。
可以设置:
低并发;
夜间加速;
白天降速。
这样系统资源更多留给客户实时消息。
十一、WechatApi 在整个架构中的位置
WechatApi 负责多账号个人微信API接入:
账号;
私聊;
微信群;
好友;
文件;
消息事件。
本地调度系统负责:
账号级队列;
优先级;
并发;
限流;
熔断;
恢复;
失败重试。
WechatApi 把不同账号的数据统一接进来。
本地系统保证这些账号不会互相拖累。
十二、账号任务看板非常重要
多账号情况下,后台不应该只显示:
账号在线 / 离线。
还可以展示:
实时任务数;
批量任务数;
平均等待时间;
失败数量;
当前并发;
是否熔断;
最近异常;
恢复状态。
管理员能够快速判断:
到底是账号本身异常,还是任务积压。
十三、账号级 SLA 可以不同
销售账号可能要求:
实时回复 5 秒内。
运营账号:
群任务允许几十秒。
历史数据账号:
同步延迟几分钟也没有问题。
因此调度器可以按账号角色设置不同 SLA。
十四、异常中心要聚合账号问题
如果账号 A 连续出现 300 条消息发送失败,不应该生成 300 个独立高优先级异常。
更合理的是:
聚合成一个“账号 A 发送能力异常”。
下面挂:
受影响任务 300 条。
管理员先处理账号问题。
账号恢复后再批量补偿。
十五、重试策略不能所有账号共用
某些账号网络环境较稳定。
某些账号偶发波动。
可以根据账号健康状态动态调整重试。
但实时消息仍然要有截止时间。
不能因为无限重试导致客户 30 分钟后才收到旧回复。
十六、日志一定要带 account_id
所有消息、任务、文件、自动回复、异常日志都应该带账号维度。
否则多账号系统排查问题时,会非常困难。
例如某条回复失败,需要知道:
来自哪个账号;
该账号当时状态;
队列是否积压;
当时并发多少。
十七、权限同样按账号隔离
普通销售查看自己账号。
销售主管看团队账号。
客服主管看客服账号。
系统管理员看全局。
任务日志、消息、文件也继承相应权限。
十八、总结
微信二次开发从一个账号扩展到几十个账号以后,真正的难点不再是“能不能同时登录这么多微信”。
而是:
一个账号出问题以后,其他账号还能不能正常工作。
WechatApi 可以作为多账号个人微信API接入底座,把不同账号的微信消息、微信群、好友和文件统一带入业务系统。
但业务系统必须继续建立账号级任务隔离:
并发配额;
实时与批量分队列;
熔断;
渐进恢复;
任务迁移规则;
账号看板;
异常聚合。
只有每个账号都有自己的运行边界,多账号微信机器人才能真正具备规模化能力。
否则账号越多,系统反而越脆弱,一个异常账号就可能拖慢整套微信自动化。