一、定义
比较官方的说法是是指利用 高效可靠 的 消息传递机制 进行与平台无关的 数据交流,并基于 数据通信 来进行分布式系统的集成。
我们可以理解为将要传输的数据放在一个队列中。
二、为什么使用消息队列
1、解耦
(1)发送者和接收者不必了解对方,只需要确认消息即可
比如在交易系统中,支付系统把支付结果放到消息中间件中,然后通知订单系统修改支付状态,这一过程中支付系统和订单系统是互不关心的,但是可以保证 数据的最终一致。
2、异步处理
![图片上传中 …]
从图中我们可以看见,A 系统将消息发送到消息队列后可以立即返回,然后去处理其他事情,而不用管 BCD,让他们自己去拿,这也就实现了异步处理。
3、流量削峰
这一点也很好理解,比如现在是用户使用的高峰期,一秒钟有 3000 条请求,但是只有两台服务器,每台服务器最多只能处理 1000 条,那就会造成系统的崩溃,如果说再增加一个服务器,还不够怎么没办,而且这样会花费不少成本,因此如果用一个消息队列,把所有请求都先放到里面,再让服务器自己去拿,就不会造成拥堵了,这就是所谓“削峰”。
![图片上传中 …]
4、广播
使用消息队列也可以很好的实现广播,如果想要发送消息给好几个用户,那么如果每个都要发一遍非常浪费效率,但是将消息放在消息队列中,让用户自己去取,就非常的高效。
三、使用消息队列需要注意的问题
1、保证高可用性
在使用消息队列的时候需要注意高可用性,最好使用分布式或者集群的消息队列,以为只把消息队列放在一台服务器上,那如果服务器出了问题,整个系统都崩了。
2、防止数据丢失
其实使用消息队列,最需要注意的就是保证数据不丢失,所以可能需要将数据进行备份等。
四、几种常用的消息队列技术
![图片上传中 …]
五、常用消息队列技术——rabbitmq
rabbitmq 与基本的消息队列模型不完全一样,而是在它的基础上增加了一个“exchange”。
![图片上传中 …]
(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… 浅谈消息队列及常见的消息中间件