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