文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

互联网面试必备之超时订单自动关闭的优雅实现

2024-12-03 18:33

关注

 

那么超时订单有哪几种实现方式呢?

超时订单自动关闭的优雅实现

1、数据库轮询(30S)

订单表(订单ID,状态,创建时间)

 

轮询数据库会带来什么问题?

2、使用DelayQueue 实现

 

DelayQueue: 阻塞队列(先进先出)

Delayed接口使对象成为延迟对象,它使存放在DelayQueue类中的对象具有了激活日期。该接口强制实现下列两个方法。

应用重启带来的问题

 

解决之道

 

从系统伸缩性角度考虑:应用集群化了怎么办?

集群化了会带来什么问题?应用之间会相互抢夺订单,特别是在应用重启的时候,重新启动的那个应用会把不属于自己的订单,也全部加载到自己的队列里去,一是造成内存的浪费,二来会造成订单的重复处理,而且加大了数据库的压力。

解决方案:

给每台服务器编号,然后在订单表里登记每条订单的服务器编号;2,更简单的,在订单表里登记每台服务器的IP地址,修改相应的sql语句即可。

几个问题:如果有一台服务器挂了怎么办?运维吃干饭的吗?服务器挂了赶紧启动啊。如果是某台服务器下线或者宕机,起不来怎么办?这个还是还是稍微有点麻烦,需要人工干预一下,手动把库里的每条订单数据的服务器编号改为目前正常的服务器的编号,不过也就是一条sql语句的事,然后想办法让正常的服务器进行处理(重启正常的服务器)。

能不能同时解决伸缩性和扩展性问题?

用delayqueue是队列,分布式情况我们何不直接引入消息中间件呢?一举解决我们应用的伸缩性和扩展性问题

我们可以使用ActiveMQ的延迟和定时投递

3、ActiveMQ延迟队列

修改配置文件(activemq.xml),增加延迟和定时投递支持

 

 

  1. "http://activemq.apache.org/schema/core" 
  2. brokerName="localhost" dataDirectory="${activemq.data}"  
  3. schedulerSupport="true"

需要把几个描述消息定时调度方式的参数作为属性添加到消息,broker端的调度器就会按照我们想要的行为去处理消息。

一共有4个属性:

  1. AMQ_SCHEDULED_DELAY :延迟投递的时间
  2. AMQ_SCHEDULED_PERIOD :重复投递的时间间隔
  3. AMQ_SCHEDULED_REPEAT:重复投递次数
  4. AMQ_SCHEDULED_CRON:Cron表达式

ActiveMQ也提供了一个封装的消息类型:org.apache.activemq.ScheduledMessage,可以使用这个类来辅助设置,使用例子如:延迟60秒

 

  1. MessageProducer producer = session.createProducer(destination); 
  2. TextMessage message = session.createTextMessage("test msg"); 
  3. long time = 60 * 1000; 
  4. message.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_DELAY, time); 
  5. producer.send(message); 

例子:延迟30秒,投递10次,间隔10秒:

 

  1. TextMessage message = session.createTextMessage("test msg"); 
  2. long delay = 30 * 1000; 
  3. long period = 10 * 1000; 
  4. int repeat = 9; 
  5. message.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_DELAY, delay); 
  6. message.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_PERIOD, period); 
  7. message.setIntProperty(ScheduledMessage.AMQ_SCHEDULED_REPEAT, repeat); 
  8. 也可使用 CRON 表达式,如message.setStringProperty(ScheduledMessage.AMQ_SCHEDULED_CRON, "0 * * * *"); 

也可使用 CRON 表达式,如message.setStringProperty(ScheduledMessage.AMQ_SCHEDULED_CRON, "0 * * * *");

4、Redis有序集合

Redis 有序集合

Redis sortedSet 集合(sorted set 也叫zset) 是一个有序集合,每个元素(member)都关联了一个score,可以通过score排序获取集合中的值。

zset常用命令:

将订单超时时间戳(long)与订单号分别设置为score与member,系统扫描第一个元素判断定是否超时,拿到分数最小的,超时时间最早的。判断与当前时间戳的关系

 

生产者

 

消费者

 

5、Redis Set 集合

将订单延迟时间的秒级时间戳设置为set集合的key,value 为订单ID

sadd set的key item的项值,item项可以有多个

按秒级的时间进行聚合,即 key为时间戳,里面可以由多个ID

 

 

总结

1、DB轮询

2、DelayedQueue

3、redis

优点 ; 解耦、异常恢复、支持分布式/集群环境

缺点

 

来源:今日头条内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯