数据库轮询
优点:
- 简单易行,支持集群操作
缺点: - 对服务器内存消耗大
- 存在延迟,比如你每隔3分钟扫描一次,那最坏的延迟时间就是3分钟
- 假设你的订单有几千万条,每隔几分钟这样扫描一次,数据库损耗极大
JDK的延迟队列(DelayedQueue)
无界阻塞队列,该队列只有在延迟期满的时候才能从中获取元素,放入DelayQueue中的对象,是必须实现Delayed接口的。
优点:
- 效率高,任务触发时间延迟低。
缺点: - 服务器重启后,数据会全部消失
- 集群扩展相当麻烦
- 因为内存条件限制的原因,比如下单未付款的订单数太多,那么很容易就出现OOM异常
- 代码复杂度较高
时间轮算法
优点:
- 效率高,任务触发时间延迟时间比delayQueue低,代码复杂度比delayQueue低。
缺点: - 服务器重启后,数据会全部消失
- 集群扩展相当麻烦
- 因为内存条件限制的原因,比如下单未付款的订单数太多,那么很容易就出现OOM异常
redis(zset方案)
自动排序取最小判断,在高并发条件下,需要加锁,不然会取到同一个数据
优点:
- 由于使用Redis作为消息通道,消息都存储在Redis中。如果发送程序或者任务处理程序挂了,重启之后,还有重新处理数据的可能性。
- 做集群扩展相当方便
- 时间准确度高
缺点: - 需要额外进行redis维护
RabbitMQ
建议使用延迟插件,死信队列只会校验队列第一个是否超时。
优点:
- 高效,可以利用rabbitmq的分布式特性轻易的进行横向扩展,消息支持持久化增加了可靠性。
缺点: - 本身的易用度要依赖于rabbitMq的运维。因为要引用rabbitMq,所以复杂度和成本变高