文章目录
————————————————————————————————
什么是消息队列
定义
消息队列:一般我们会简称它为MQ(Message Queue)。
【消息队列就是一个存放消息的队列】
Message Query(MQ),消息队列中间件,很多初学者认为,MQ通过消息的发送和接受来实现程序的异步和解耦,mq主要用于异步操作,这个不是mq的真正目的,只不过是mq的应用,mq真正的目的是为了通讯。
他屏蔽了复杂的通讯协议,像常用的dubbo,http协议都是同步的。
这两种协议很难实现双端通讯,A调用B,B也可以主动调用A,而且不支持长连接。mq做的就是在这些协议上构建一个简单协议——生产者、消费者模型,mq带给我们的不是底层的通讯协议,而是更高层次的通讯模型。他定义了两个对象:发送数据的叫做生产者,接受消息的叫做消费者,我们可以无视底层的通讯协议,我们可以自己定义生产者消费者。
复习一下队列。
队列是一种先进先出的数据结构(线性结构)。和他相似的还有栈(先进后出)。
补充:
使用队列的还有一个场景就是线程池队列:有界队列和无界队列。用来存储任务。
消息队列:
有两个名词—生产者、消费者
生产者——生产新建
消费者——消费使用
消息队列的特性:
异步、削峰、解耦
1、解耦:
业务模块之间没有关联,一个服务挂掉不会影响其他业务,可以通过后续补偿或者分布式事务解决。
缺点:事务问题,只要使用消息队列,都会面临事务问题(无法保证原子性)。分布式事务解决框架。分布式事务般都遵循最终一致性。
就像高可用里面说的一样,发淘金币服务挂了,关下单什么关系,发淘金币服务挂了,我还是可以正常下单,只不过后期可以数据补偿或者分布式事务去解决这个问题。
2、削峰:
比如说我平时服务就只能支撑几万的qps,像淘宝京东那种秒杀,那时候服务突然打进来(如果采用第二种方案)那服务就会直接被压死了。但是如果采用消息队列,这秒杀进来的所有的请求都不会直接打到具体服务上,都会先打到消息队列里,然后我后面的服务再慢慢消费。
可以看看淘宝京东双11秒杀的时候,是不是有的时候慢是慢了点,但是服务起码没挂。等我秒杀结束之后,服务还能正常运转。
消息队列就像是一个三峡大坝,用来拦截上游给的压力。
3、异步:
连接消息队列的服务可以异步去执行。而且每次多增加一个步骤,我下单的代码是不平要动的,只需要再增加一个消费者即可。
使用场景
消息队列的三个最主要的作用是:异步、削峰、解耦,一定要烂熟于心。
传统串行化设计
先看看传统的设计(如果说业务体量小,并发不大,可以使用这种设计)
客户