日常学习小结,不计内容、不计形式。
场景提问:
- 12306订票后,超时未付款,则取消预订或消息提示,如何实现?
- 美团下单后未付款,超时未付款,取消订单或短信提示,如何实现?
延迟队列
1、 DB轮询
- 简单实现:创建定时任务,定时扫描DB,将记录的创建时间与现在时间对比,判断是否超时。
- 优点:实现简单、无技术难点、异常恢复方便、支持分布式\集群开发。
- 缺点:增加DB负担,性能差,实时性差。
2、DelayQueue(jdk延迟队列)
- 简单实现:放进DelayQueue的对象必须实现Delayed接口,重写排序方法,将先过期的放在队首。通过take()或poll()取超时的任务。
- 优点:实现简单、性能较好
- 缺点:基于jdk内存,异常恢复难,分布式\集群实现能
3、redis-zsit
- 简单实现:zsit(有序集合),每一个member都会有一个score,可以通过score排序。zadd()添加元素,可以将当前时间设为score,通过zrange()获取最小score的元素,判断有没有超时
- 优点:异常恢复强、支持分布式\集群实现、可扩展
- 缺点:增加redis维护、占用带宽
4、rabbitmq TTL+DLX
- TTL:rabbitmq消息超时时间
- DLX:私信队列
- 简单实现:一般基于队列(区别于消息本身)设置消息的超时时间,及队列的私信队列,消息过期会进入私信队列,对私信队列的消息进行消费。
- 优点:异常恢复强、支持分布式\集群实现、可扩展
- 确定:增加rabbitmq维护、占用带宽