怎样做技术选型
•不要特立独行,优先使用公司约定技术栈,统一组件!
•使用成熟的技术!
•使用成熟技术的成熟功能!
•使用团队熟悉技术栈中间件!
•考虑后期数据量用户量
•考虑后期运维难度(结合公司实施人员运维水平)
常用的解决方案
•
方案1:
•
可以利用redis自带的key自动过期机制,短信推送时将id写入redis,过期时间30分钟,30分钟后检查短信状态,如果未收到短信发送状态,则进行处理。(内网短信平台选用次方案)
@Bean
public RedisMessageListenerContainer getListenerContainer(RedisConnectionFactory connectionFactory){
//创建连接容器
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
//放入redis连接
container.setConnectionFactory(connectionFactory);
//写入需要被监听的类型,即超时监听
Topic topic = new PatternTopic("__keyevent@0__:expired");
container.addMessageListener(getTopicListener(phoneMsgService), topic);
return container;
}
@Override
public void onMessage(Message message, byte[] bytes) {
byte[] body = message.getBody();
String keyName = new String(body);
log.info(keyName);
//超时还未收到短信发送状态的短信再次添加到队列,进行业务处理
if (keyName.startsWith(MSG_SEND_KEY)){
String pc = keyName.substring(MSG_SEND_KEY.length());
phoneMsgService.drainMessagePushReadyQueue(pc);
}
}
•方案2
•使用quartz定时任务,短信推送后,生成一个30分钟后运行的任务,30分钟后检查短信状态,如果未收到短信发送状态,则进行处理。
•方案3
•基于MQ延时队列(使用了rabbitmq的延时队列,需要安装延时插件)
•方案4
•按时间间隔例如每分钟轮询数据库,如果超时则进行处理,效率差!时间精准度底!数据库压力大,不建议使用。
版权归原作者 wuhan_xiaoniu 所有, 如有侵权,请联系我们删除。