一、定义

比较官方的说法是是指利用 高效可靠 的 消息传递机制 进行与平台无关的 数据交流,并基于 数据通信 来进行分布式系统的集成。
我们可以理解为将要传输的数据放在一个队列中。

二、为什么使用消息队列

1、解耦
(1)发送者和接收者不必了解对方,只需要确认消息即可
比如在交易系统中,支付系统把支付结果放到消息中间件中,然后通知订单系统修改支付状态,这一过程中支付系统和订单系统是互不关心的,但是可以保证数据的最终一致

2、异步处理

![图片上传中...]

从图中我们可以看见,A系统将消息发送到消息队列后可以立即返回,然后去处理其他事情,而不用管BCD,让他们自己去拿,这也就实现了异步处理。

3、流量削峰
这一点也很好理解,比如现在是用户使用的高峰期,一秒钟有3000条请求,但是只有两台服务器,每台服务器最多只能处理1000条,那就会造成系统的崩溃,如果说再增加一个服务器,还不够怎么没办,而且这样会花费不少成本,因此如果用一个消息队列,把所有请求都先放到里面,再让服务器自己去拿,就不会造成拥堵了,这就是所谓“削峰”。

![图片上传中...]

4、广播
使用消息队列也可以很好的实现广播,如果想要发送消息给好几个用户,那么如果每个都要发一遍非常浪费效率,但是将消息放在消息队列中,让用户自己去取,就非常的高效。

三、使用消息队列需要注意的问题

1、保证高可用性
在使用消息队列的时候需要注意高可用性,最好使用分布式或者集群的消息队列,以为只把消息队列放在一台服务器上,那如果服务器出了问题,整个系统都崩了。

2、防止数据丢失
其实使用消息队列,最需要注意的就是保证数据不丢失,所以可能需要将数据进行备份等。

四、几种常用的消息队列技术

![图片上传中...]

五、常用消息队列技术——rabbitmq

rabbitmq与基本的消息队列模型不完全一样,而是在它的基础上增加了一个“exchange”。

rmq.jpg
(1)在图中我们可以看到,exchange(交换器)接受生产者的消息并将消息路由给队列。
(2)交换器和队列是Binding 绑定的,用于消息队列和交换器之间的关联。一个绑定就是基于路由键将交换器和消息队列连接起来的路由规则,所以可以将交换器理解成一个由绑定构成的路由表
(3)在每个消息的消息头中都包含了路由键,交换器就根据路由键转发消息到队列中。
(4)exchange一般有以下4种类型:
direct:如果路由键和绑定键完全一致,就转发到相应的队列。
fanout:会将消息转发到所有的队列中去。
topic:会将消息发送到匹配的队列中去(使用#号和*号)。
header:header不会匹配路由键,而是匹配请求头,这种类型已经很少使用了。

参考资料:https://juejin.im/post/5a67f7... 消息队列之RabbitMQ
https://juejin.im/post/5cb025... 什么是消息队列
https://juejin.im/post/5b41fe... 浅谈消息队列及常见的消息中间件


hushucheng
42 声望2 粉丝

« 上一篇
Java泛型