基本概况了解--->消息队列-MQ

什么是消息:A要通知B,发送的东西叫做消息。

什么是队列:先进先出,顺序

消息队列:存放消息的队列。

为什么会产生消息队列思想?

传统的 (串行的)(时间假设):

基本概况了解--->消息队列-MQ_第1张图片

优秀的程序架构设计需要遵守的守则:低耦合,高内聚。

引入消息队列:客户端只管发消息,给消息队列,后边的功能服务,察觉到有消息在消息队列,就去执行相应逻辑,所以客户端只要发送成功就可以不要管后边啦。

缺点是:比如服务1 是 订单服务,服务2 是 减库存,服务3 是 短信通知。而如果下了订单,短信也通知了,但是库存没减。那就产生问题了。涉及到事务

基本概况了解--->消息队列-MQ_第2张图片

        事务

                只要涉及到消息队列,肯定要处理事务问题。

                有一个特性是:原子性。我所有动作,要么都不执行,要不全部执行成功。

                        比如:张三给我转100块。拆分为两个动作:张三减100 ,我加100.。不能出现,张三减了我没加,也不能出现我加了,张三没减。

什么是MQ

Message Query(MQ),消息队列中间件,很多初学者认为,MQ通过消息的发送和接受来实现程序的异步和解耦,mq主要用于异步操作,这个不是mq的真正目的,只不过是mq的应用。

mq真正的目的是为了 通讯。他屏蔽了复杂的通讯协议,像常用的dubbo,http协议都是同步的。

        比如:A 服务是 java写的,B服务是用c++写的。这两个服务这么弄一块呢,需要消息队列。

B如果需要什么(假设 账号 密码。),A就把B需要的放到消息队列里,B直接监听消息队列中的账号密码。基本概况了解--->消息队列-MQ_第3张图片

 

这两种协议很难实现双端通讯,A调用B,B也可以主动调用A,而且不支持长连接。mq做的就是在这些协议上构建一个简单协议——生产者、消费者模型,mq带给我们的不是底层的通讯协议,而是更高层次的通讯模型。

他定义了两个对象:发送数据的叫做生产者,接受消息的叫做消费者,我们可以  无视底层的通讯协议(传统服务来说 A用http通信,那么B也得用http返回。但引入消息队列后 A可以用 http,而B可以用dobbo协议),我们可以自己定义生产者消费者。

MQ的两种流派

1,有broker的

broker是什么,可以理解为是一个中转站

        每个服务分别订阅一个队列,客户端发了消息,放入队列中,然后服务再去监听,而消息要放到哪个队列就是由 broker 决定。基本概况了解--->消息队列-MQ_第4张图片

   (      一个队列可以多个服务,一个服务也可以订阅多个队列。具体看业务。

                例如:一个订单服务,订阅了两个队列,如果两个队列都收到消息,那么订单服务就会执行两次代码,下两次订单。这就有问题啦,就得有 分布式锁。)

生产者将消息发送给他就结束自己的任务了,broker将消息主动推送给消费者(具体的将消息推送到哪个队列,或者说消费者主动请求)(意思是 broke 主动去放消息在队列中,或者是等到消费者,请求某个服务时,broke才去把消息放入队列中)

        重topic(队列)

        必须要有topic

               kafka:全球消息处理性能最快的一款mq

               rocket:阿里内部的一个大神根据kafka的执行原理手写的,性能与kafka差不多,但是功能上比kafka要多,比如说顺序消费。

        轻topic  

        可以没有topic,可玩性高,topic只是一种中转模式

                rabbitmq   

2,无broker的

zeromq:没有使用broker,是直接使用 socket 进行通信。

基本概况了解--->消息队列-MQ_第5张图片

他们直接通过长连接,一直连着的。发消息直接通到服务端,就过一下MQ看看哪个服务订阅了,就直接发过去。

--------------------------------------

思考:客户端每秒向队列生产一万条数据,但是消费者一秒只能消费100条数据怎么办?(消息堆积问题)?

方案一:增加消费者。

方案二:限流,首先过滤掉一部分请求。

你可能感兴趣的:(java,后端)