项目中用到微信小程序模板推送,原来流程如下:
1、获取当前公众号关注用户列表;
2、根据用户列表获取用户信息;
3、循环用户列表进行发送;
4、等待发送返回结果。将用户信息(昵称)、发送状态等保存到发送记录表;
存在问题:
1、每次推送都会到微信获取用户列表,并获取每个用户的昵称。接口调用频率高,发送时间较长。
推送:5000个用户,大约需要10分钟左右;
优化方案:(开启开发者功能)
1、用户关注公众号时,获取用户信息,存入用户信息表;用户取消关注也同步修改本地数据;
2、每晚定时同步公众号当前关注用户列表,防止遗漏;
3、推送模板时从本地获取公众号当前关注用户数据,直接推送这批用户。节省来回调用微信接口的时间成本;
当然,如果单纯这样优化,推送速度并没有明显提升;
再次优化:
1、推送模板消息使用线程池。我使用了java自带线程池newFixedThreadPool进行推送。设置每100毫秒推送10条,5000条数据也就1分钟推送完成。完美满足业务实时性需求。
2、线程池使用参考文档:http://cuisuqiang.iteye.com/blog/2019372
(2) newFixedThreadPool
创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。示例代码如下: