中间件—消息队列

消息队列

什么是消息队列

定义

消息队列:一般我们会简称它为MQ(Message Queue)。 【消息队列就是一个存放消息的队列】 Message Query(MQ),消息队列中间件,很多初学者认为,MQ通过消息的发送和接受来实现程序的异步和解耦,mq主要用于异步操作,这个不是mq的真正目的,只不过是mq的应用,mq真正的目的是为了通讯。 他屏蔽了复杂的通讯协议,像常用的dubbo,http协议都是同步的。 这两种协议很难实现双端通讯,A调用B,B也可以主动调用A,而且不支持长连接。mq做的就是在这些协议上构建一个简单协议——生产者、消费者模型,mq带给我们的不是底层的通讯协议,而是更高层次的通讯模型。他定义了两个对象:发送数据的叫做生产者,接受消息的叫做消费者,我们可以无视底层的通讯协议,我们可以自己定义生产者消费者。

先复习一下队列

队列是一种先进先出的数据结构(线性结构)。和他相似的还有栈(先进后出)。

补充:

使用队列的还有一个场景就是线程池队列:有界队列和无界队列。用来存储任务。

消息队列:

有两个名词—生产者、消费者

生产者——生产新建

消费者——消费使用

消息队列的特性:

异步、削峰、解耦

1、解耦:

业务模块之间没有关联,一个服务挂掉不会影响其他业务,可以通过后续补偿或者分布式事务解决。

缺点:事务问题,只要使用消息队列,都会面临事务问题(无法保证原子性)。分布式事务解决框架。分布式事务般都遵循最终一致性。

就像高可用里面说的一样,发淘金币服务挂了,关下单什么关系,发淘金币服务挂了,我还是可以正常下单,只不过后期可以数据补偿或者分布式事务去解决这个问题。

2、削峰:

比如说我平时服务就只能支撑几万的qps,像淘宝京东那种秒杀,那时候服务突然打进来(如果采用第二种方案)那服务就会直接被压死了。但是如果采用消息队列,这秒杀进来的所有的请求都不会直接打到具体服务上,都会先打到消息队列里,然后我后面的服务再慢慢消费。

可以看看淘宝京东双11秒杀的时候,是不是有的时候慢是慢了点,但是服务起码没挂。等我秒杀结束之后,服务还能正常运转。

消息队列就像是一个三峡大坝,用来拦截上游给的压力。

3、异步:

连接消息队列的服务可以异步去执行。而且每次多增加一个步骤,我下单的代码是不平要动的,只需要再增加一个消费者即可。|

消息队列也并不是全是优点。也有一些缺点。

使用场景

消息队列的三个最主要的作用是:异步、削峰、解耦,一定要烂熟于心。

传统串行化设计

先看看传统的设计(如果说业务体量小,并发不大,可以使用这种设计)

客户端调用下单服务,下单服务调用扣减库存,扣减库存中调用扣减淘金币……,调用完成再依次返回。
在这里插入图片描述
观察一下上面的设计,属于典型的串行化调用,这种设计模式有一个很大的优势,就是代码简单,出现问题很容易定位到问题。但是也有很多劣势,下面咱们从**三高(高并发,高性能,高可用)**三个方面去评审一下这个设计。

高可用:这些服务假如有一个服务挂掉(宕机或者网络波动),就意味着我这个请求失败了,这样用户体验会极差,用户会频繁看到支付失败。

高并发:因为这些操作都是由一个线程(主线程)去执行这些操作,所以当我们的Q

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值