1.链路设计:
短信发送平台,短信发送功能
a,页面上导入手机号码提交(立即生成对应的批次号),异步短信发送流程。
b,短信发送流程为对每个手机号构建对应的明细信息,统一入库,入库完成进行短信校验操作,使用流程框架对每个手机号校验(100w就是100w次),校验完成对通过mq明细表进行更新(短信状态,内容等)(对应代码),然后放入redis队列。
c,在hallway(发送短信模块),使用netty建立通道连接(文本短信的协议为tcp长连接)从redis取出数据发送短信。
d,发送完成,通道侧会通过tcp连接来返回对应的状态报告(及响应,非及时),接收到状态报告发送mq进行明细表进行更新(和校验后的topic相同)。
2.出现问题:
测试环境压测200w短信发送,入库完成后一直堆积在mq中,导致发送非常缓慢,更新短信明细数据缓慢。
3.问题排查:
尝试项目重启后很快更新明细的日志不打印并且触发本地队列的阈值,mq消费者卡住,发现cup飙升,mq消息堆积没办法取消息,尝试将本地队列的改大,发现达到阈值一样会出现。
尝试将mq消费者这边多线程接,发现情况一样,但是看到阈值时触发的日志,发现使用的是主线程,而且update的时间很长,查看mysql服务,发现cup飙升,查询正在使用的表。
SHOW OPEN TABLES WHERE In_use > 0;
发现扫到了未涉及的表(明细使用了shrading-jdbc。。。),仔细检查代码,发现update没有带分片字段。
4.解决
手写了个xml,再次压测试发现挤压变少,调整阈值的逻辑,采用异步线程执行(防止主线程执行update导致mq消息挤压)。