延时消息队列常用的解决方案

消息队列

什么是消息队列?曾记得在我刚入行以来第一次听到这个名词的时候就觉得这个东东到底有什么用?和数据以前在大学数据结构课程上的队列有啥区别?实际项目中又有什么用呢?各种问题困扰着我,但是我觉得只要怀着对技术有一份狂热,就要对它进行知根知底,这是对技术提高以及成长的必经之路。
其实消息队列就是我们所了解的基本数据结构的队列一个概念,包括最基本的入队和出队,先进先出的特性,当然现在市面上的消息队列有很多种产品,比如kafka、rabbitmq、activemq、rocketmq、以及基于redis的list结构的轻量级消息队列,他们都拥有基本的队列特性,有的产品也对有包括持久化、事务一致性、延迟等特性。在我看来这个东东就是一个中间件,被人们当成系统解耦的利器,也可以用来解决特殊的业务场景,比如:数据缓冲等。

来讲讲一些应用场景

最近做项目的时候我负责的是核心订单功能,用户在下单的时候订单会有个过期时间,在超过过期时间的订单将自动失效,常用的集中解决思路如下:

  • 后台开启若干线程进行扫面订单,判断过期时间并更改状态,缺点:若量大,服务器会宕机
  • 使用redis,将产生的订单放入redis并设置 失效时间
  • 定时任务,每分钟扫描一次,缺点:实时性不高,同时服务器压力大
  • 使用delayedQueue延时队列,将订单按顺序放入延时队列,设置到期时间,到期后出队,单机环境下推荐
  • 使用支持分布式的延迟MQ,例如rabbitmq,分布式环境下推荐