一、什么是消息队列
在学习消息队列之前,先说一下什么是队列。队列可以说是一个数据结构,可以存储数据,如下图,我们从右侧(队尾)插入元素(入队),从队头获取元素(出队)。
了解了队列之后,我们来看一下什么是消息队列,消息队列就是我们常说的MQ,英文叫Message Queue,是作为一个单独的中间件产品存在的,独立部署。
二、为什么使用消息队列
1.解耦
使用MQ之前,系统A产生消息系统B和系统C需要系统A的消息,那么就需要系统A去调用系统B和系统C,这样如果再来一个系统D也需要这个消息,就需要修改系统A中的代码。然后测试上线。如果有一天系统B不需要系统A中的消息了,那么还是需要修改系统A中的代码。在修改的过程中还需要考虑会不会影响其他的系统,修改完毕之后测试然后再上线。这样维护系统A的人就会很烦。
使用MQ之后,系统A只需要负责把消息放到MQ中就不需要管了。也不需要考虑是不是有新的系统需要这个消息,也不需要考虑谁不用了。完全交给MQ去做。系统A和其他系统之间的耦合降低了。
2.异步
Data newData = productData();//系统A经过一些逻辑处理后产生了数据,耗时200ms Response responseB = callSysB(newData);//系统A调系统B接口发送数据,耗时300ms Response responseC = callSysC(newData);//系统A调系统C接口发送数据,耗时300ms
使用MQ之前,系统A产生了一条数据,然后先调用系统B的接口发送数据,然后调用系统C的接口发送数据,最后调用系统D的接口发送数据。200+300+300=800ms。这就会导致响应的非常慢。
Data newData = productData();//系统A经过一些逻辑处理后产生了数据,耗时200ms writeDataToMQ(newData);//往MQ里写消息,耗时50ms
使用MQ之后,系统A产生了一条数据,直接交给MQ就可以了。系统B和系统C自己去MQ中拿慢慢消费就可以了。200+50=250ms。250ms用户就可以得到结果。
3.削峰
我们大家都知道双十一淘宝京东都会搞活动。双十一这一天会把平时的流量高出几十倍几百倍。如果没有使用MQ下单的信息直接实时操作数据库,就会导致数据库承受的压力太大。数据库挂掉整个系统就不能使用了。如果使用MQ下单的数据只需要往MQ里发送消息,我的订单系统可以设定消费的频率,比如每秒我就消费2000个消息(在数据库的可承受范围),不管你下游系统每秒下多少单,我都保持这个速率,既不会影响我订单系统的数据库,也不影响你下游系统的下单操作,很好的保护了系统。剩余的消息慢慢消费就可以了。
三、如何使用消息队列
1.添加RabbitMQ的依赖
<!-- amqp依赖,包含RabbitMQ--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency>
2.添加ReabbitMq配置
spring rebbitmq: host:IP地址 port:端口号 virtual:/ username:guest password:guest
3.编写消息生产者
4.编写消息消费者
5.测试类
@Autowired private SpringMqProduceTest springMqProduceTest; @GetMapping("testMq/{message}") public String testMq(@PathVariable("message") String message){ springMqProduceTest.testSimpleQueue("testMq",message); return "已发送:"+message; }
6.执行结果
四、总结提升
RabbitMQ是一个功能强大且可靠的消息中间件,适用于各种场景,包括分布式系统、微服务架构、异步任务处理等。它提供了丰富的特性和灵活的配置选项,使得消息传递变得简单和可靠。
对于消息队列足够的了解我们在使用的过程中才会更加的得心应手。我们才能明确什么情况下应该使用消息队列。