消息发送系统
项目中的一种做法,简化总结如下
1.对外暴露接口1,供业务方调用
2.接口2的实现就是同步发送各种消息,比如发短信,发微信等,但不保证
3.对外暴露接口2,供业务方调用
4.接口2内部实现,也是发送消息,但是是通过mq解耦的
4.1.业务方调用接口2后,接口2的实现将会发送一个topic;
4.2.发送短信系统,消费这个topic,发送短信
4.3.发送微信的系统,消费这个topic,发送微信的系统
4.4.等等其他系统,都消费这个topic,可扩展
问题1:发送消息,要防重,一条消息不能重复发两次,因为接口1和接口2都是发短信,很可能业务方会同时调用
在2.2的地方,加入redis防重,每条消息都给一个唯一id,发送前就在redis记录一下状态,正在发送,发送完成后改状态为发送成功
每次发送前都会判断redis中是否有这个记录,有就不发了,没有就加锁记录后再发送,发送成功后解锁
问题2:消息很多的时候,mq重试会造成更多的挤压,所以这个mq将会关闭重试机制,那么万一发送失败又没有重试,要怎么办呢?
引入延迟mq,在发送业务mq的同时,再发一条延迟mq,在业务完成后的一定时间内再回去检查,保证这条消息不会丢失