怎样做技术选型
•不要特立独行,优先使用公司约定技术栈,统一组件!
•使用成熟的技术!
•使用成熟技术的成熟功能!
•使用团队熟悉技术栈中间件!
•考虑后期数据量用户量
•考虑后期运维难度(结合公司实施人员运维水平)
常用的解决方案
• 方案 1 :
• 可以 利用 redis 自带的 key 自动过期机制 ,短信推送时将 id 写入 redis ,过期时间 30 分钟, 30 分钟后检查短信状态,如果未收到短信发送状态,则进行处理 。(内网短信平台选用次方案)
@Beanpublic 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;}
@Overridepublic 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
•按时间间隔例如每分钟轮询数据库,如果超时则进行处理,效率差!时间精准度底!数据库压力大,不建议使用。