前言:MQ 的本质是什么呢? 消息队列,又叫做消息中间件。是指用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息队列模型,可以在分布式环境下扩展进程的通信(维基百科)。
1.为什么要使用 MQ?
1)实现异步通信
2)实现系统解耦
3)实现流量削峰
MQ 既然是队列,就有先进先出的特性,这样,我们就可以先把所有的流量承接下来,转换成 MQ 消息发送到消息队列服务器上,业务层就可以根据自己的消费速率去处理这些消息,处理之后再返回结果。就像我们在火车站排队一样,大家只能一个一个买票,不会因为人多就导致售票员忙不过来。如果要处理快一点,大不了多开几个窗口(增加几个消费者)。
2.RabbitMQ 简介
1)基本特性:
1. 高可靠:RabbitMQ 提供了多种多样的特性让你在可靠性和性能之间做出权衡,包 括持久化、发送应答、发布确认以及高可用性。2.灵活的路由:通过交换机(Exchange)实现消息的灵活路由。3.支持多客户端:对主流开发语言(Python、Java、Ruby、PHP、C#、JavaScript、Go、Elixir、Objective-C、Swift 等)都有客户端实现。4.集群与扩展性:多个节点组成一个逻辑的服务器,支持负载。5.高可用队列:通过镜像队列实现队列中数据的复制。6.权限管理:通过用户与虚拟机实现权限管理。7.插件系统:支持各种丰富的插件扩展,同时也支持自定义插件。8.与 Spring 集成:Spring 对 AMQP 进行了封装。
2)AMQP 协议
1.总体介绍:高级消息队列协议,是一个工作于应用层的协议,最新的版本是 1.0 版本。
2.工作模型:由于 RabbitMQ 实现了 AMQP 协议,所以 RabbitMQ 的工作模型也是基于 AMQP的
名词解释:1)Broker:这台 RabbitMQ 的服务器我们把它叫做 Broker,中文翻译是代理/中介,因为 MQ 服务器帮助我们做的事情就是存储、转发消息。 2)Connection:无论是生产者发送消息,还是消费者接收消息,都必须要跟 Broker 之间建立一个连接,这个连接是一个 TCP 的长连接。3)Channel:它是一个虚拟的连接。我们把它翻译成通道,或者消息信道。为了解决所有的生产者发送消息和消费者接收消息,都直接创建和释放 TCP 长连接的话,对于 Broker 来说肯定会造成很大的性能损耗的问题 4)Queue:队列是真正用来存储消息的,是一个独立运行的进程,有自己的数据库(Mnesia)。消费者获取消息有两种模式,一种是 Push 模式,只要生产者发到服务器,就马上推送给消费者。另一种是 Pull 模式,消息存放在服务端,只有消费者主动获取才能拿到消息。消费者需要写一个 while 循环不断地从队列获取消息吗?不需要,我们可以基于事件机制,实现消费者对队列的监听。5)Exchange:用来实现消息的灵活路由,交换机是一个绑定列表,用来查找匹配的绑定关系。队列使用绑定键(Binding Key)跟交换机建立绑定关系。6)Vhost:VHOST是虚拟主机, 除了可以提高硬件资源的利用率之外,还可以实现资源的隔离和权限的控制。它的作用类似于编程语言中的 namespace 和 package,不同的 VHOST 中可以有同名的 Exchange 和 Queue,它们是完全透明的。
3)路由方式-交换机
1.直连 Direct:队列与直连类型的交换机绑定,需指定一个精确的绑定键。生产者发送消息时会携带一个路由键。只有当路由键与其中的某个绑定键完全匹配时,这条消息才会从交换机路由到满足路由关系的此队列上。
2.主题 Topic:队列与主题类型的交换机绑定时,可以在绑定键中使用通配符。两个通配符:# 表示0 个或者多个单词 * 表示不多不少一个单词(单词(word)指的是用英文的点“.”隔开的字符。例如 abc.def 是两个单词)。
3.广播 Fanout:主题类型的交换机与队列绑定时,不需要指定绑定键。因此生产者发送消息到广播类型的交换机上,也不需要携带路由键。消息达到交换机时,所有与之绑定了的队列,都会收到相同的消息的副本。