SpringBoot笔记十三:消息队列

什么是消息队列

消息队列就是消息存储的容器,Java里面有两种

  1. JMS:Sun公司出品,有两种模式,点对点和发布订阅。
  2. AMQP:消息队列的一个协议,其实现有RabbitMQ,stormMQ等

我们会重点讲解RabbitMQ

消息队列的作用

异步通信

例如下面的案例,用户注册之后,我需要存储用户的信息,还要发邮件,发短信给用户。传统的方式呢,像第一个图,一步一步来,需要150ms

第二幅图呢好点了,用户信息存储到数据库之后,发送邮件和发送短信两个同时进行。需要100ms

第三幅图使用了消息队列,用户信息存储到数据库之后,直接存入消息队列,然后直接返回。是的,你没看错,直接返回了,这样用户等待的时间大概只需要55ms,真的是超级快了。那你可能会问了,消息队列的方式邮件和短信不计算时间了?肯定计算啊,但是你发邮件和发短信和用户有什么关系?用户注册之后提示注册成功就可以了,邮件和短信可以异步的去执行发送。

总结:

  1. 用户可以选择等待150ms看到注册成功的消息,有邮件和短信
  2. 用户可以选择等待100ms看到注册成功的消息,有邮件和短信
  3. 用户可以选择等待55ms看到成功的消息,邮件和短信稍后回来

应用解耦

比如一个商城系统,用户下了一个订单,我们肯定要去库存系统里面查一下,还有没有货了。这两个系统写在一起的话耦合度肯定是很高的。

现在采用消息队列的方式,订单系统和库存系统可以独立出来。用户下了订单,就存到消息队列里面,库存系统订阅了消息队列,里面一有内容就会去读取。

流量削峰

所谓的流量削峰,就类似于现在的1元秒杀活动。假如1万个人去秒杀一个1元商品,肯定不可能我1万的人一个一个的去判断,这样负载太大了。原理就是1万个用户请求进消息队列,我消息队列就一个位置,谁进去了谁就1元秒杀了,后面没进去的就不用判断了。秒杀业务处理就对消息队列里面的那一个幸运儿进行处理就可以了。所以,秒杀活动,你没进去,就别傻傻的在刷新了,因为你已经没有判断的资格了.......

RabbitMQ

RabbitMQ流程简介

讲一下,RabbitMQ的流程,如下图,首先是发布者发一个消息到RabbitMQ

我们可以看到RabbitMQ里面有很多的交换器路由和消息队列。很多。

交换器路由可以绑定多个消息队列,每个消息队列可以被多个交换器路由绑定

发布者发布的消息选择一个交换器路由,然后交换器路由会通过 模式 发给消息队列,这个模式下面讲。然后客户可以去获取队列的消息。

RabbitMQ的三种模式

上面讲了,交换器路由给队列发消息是通过模式筛选的,模式有三种

  1. Direct:点对点模式,交换器路由只会给路由键为XXX的队列发消息
  2. Topic:模糊匹配模式,# 匹配多个单词,* 匹配一个单词
  3. Fanout:广播模式,交换器路由的每个绑定的队列都会收到消息

这个模糊匹配模式,我需要讲解一下,挺有意思的,#是多个单词匹配,例如 Vae.#可以表示为 Vae.Music.com 。而是一个单词,Vae.就只能跟一个单词,例如 Vae.Music 后面不能再加了
假如我有一个交换器路由,绑定了4个队列,分别为 Vae.com,Vae.Music.com,shuyunquan.com,shuyunquan.Music.com
现在我的交换器路由发一个消息,路由键是Vae.#,消息内容是:哈哈哈 。那么请问,这四个队列,哪几个可以收到消息呢?答案肯定是Vae.com,Vae.Music.com可以收到消息了,那么路由键是 #.com呢?又会是哪几个队列收到消息?简单吧

学了RabbitMQ的流程和三种模式,我们要开始实战一下了

安装RabbitMQ

我们还是使用Docker安装,你如果没学过Docker,你就不会知道Docker有多爽,我写的有Docker的博客,自己去翻阅学习

待续。。。

猜你喜欢

转载自www.cnblogs.com/yunquan/p/10442666.html