什么是消息队列(MQ)

一、什么是消息队列(MQ,Message Queue)

通俗理解就是消息用队列的模式发送,把要传输的数据放在队列中。图中绿色产生Message的叫做生产者,黄色的从队列里取出Message的叫做消费者

什么是消息队列(MQ)

 

二、为什么要用消息队列

1.解耦

系统中存在,A,B,C三个系统。A能够产生一个ID,B,C需要从A中得到一个ID。

什么是消息队列(MQ)

 

但是随着应用发展,更多的系统需要去A中取得ID这个数据,A需要在系统上调用对应需要数据的系统的接口,也有很多系统不断下线不需要从A中取得ID这个数据。每一次增加减少消耗数据的系统都需要在A上新建删除一个对应的接口,对于没有调用成功的还需要选择 返回fai l还是 继续重试。最后A系统的负责人在一次次增删下抵不住压力就跑路了。。。

什么是消息队列(MQ)

 

但是有了消息队列就不一样了,像开始的图显示,A系统只需要把数据写到消息队列中,让其他系统自己来消息队列里取就行了。好处就是:

1.系统A只需要写入数据到队列中,不需要关心谁来取这个数据

2.其他系统不需要数据时,不需要更改系统A的代码

3.取数据只跟消息队列有关,消费者挂了跟生产者无关

这样解耦就实现了

 

2.异步

A系统在将数据写到消息队里中就可以去执行其他操作,不需要等待调用B,C系统完成的时间。

例子(简单可能不恰当的例子):

你去饭店(这个饭店需要你先买单后给你一个号码(系统A),拿号码可以去厨房让师傅烧菜(系统B),去后台开发票(系统C)),最后你才能吃饭。之后饭店觉得这样确实不妥,就增加了一个服务台(消息队列)接收你买单后的号码,厨房(系统B)和后台(系统C)只需要去服务台拿到你的号码他们就做菜开发票,你可以直接等着吃饭。这样你的时间就大大节省了。

例子有点不恰当,道理是这个道理。

 

3.削峰/限流

还是上面的例子,没有服务台(消息队列)之前。如果有许多顾客来吃饭,那就需要在厨房(系统B)和后台(系统C)排起长队,厨房(系统B)和后台(系统C)最后处理不过来最后不干了(无法营业)。如果有了服务台(消息队列),只需要服务台收到你的号码等后台和厨房处理就行了。厨房和后台可以管控处理速度(虽然顾客等的时间会硬气顾客不满意,但至少店还能开得下去继续营业

三、使用消息队列需要解决什么问题

1.高可用

这个是所有服务都会遇到的问题,如果不做高可用消息队列一炸,整个系统也不能运行了。使用消息队列的时候选择集群式,分布式的搭建方法,提高MQ的高可用。

2.数据丢失

需要把消息队列中的消息存放在哪里?内存,服务器挂掉了就没有了。硬盘持久化的话,需要实时同步到硬盘还是异步到硬盘存储?

3.消费者如何得到队列的数据

是直接去最新的还是按顺序看有没有需要的新的数据?

4.消息重复消费问题

5.保证消息队列的绝对顺序