初始 RabbitMQ 消息队列

文章目录

  • 一、消息队列
  • 二、RabbitMQ 是什么?
  • 三、RabbitMQ 设计架构
  • 四、WebUI 操作 RabbitMQ
    • 4.1 虚拟主机 (Virtual Host)
    • 4.2 交换机 (exchanges)
    • 4.3 消息队列 (Queues)


提示:以下是本篇文章正文内容,RabbitMQ 系列学习将会持续更新

在这里插入图片描述

一、消息队列

我们之前如果需要进行服务间远程调用,那么一般可以通过发送 HTTP 请求来完成。而现在,我们可以使用第二种方式,就是消息队列,它能够将发送方发送的信息放入队列中,当新的消息入队时,会通知接收方进行处理,一般消息发送方称为生产者,接收方称为消费者
初始 RabbitMQ 消息队列_第1张图片
这样我们所有的请求,都可以直接丢到消息队列中,再由消费者取出,不再是直接连接消费者的形式了,而是加了一个中间商,这也是一种很好的解耦方案,并且在高并发的情况下,由于消费者能力有限,消息队列也能起到一个削峰填谷的作用,堆积一部分的请求,再由消费者来慢慢处理,而不会像直接调用那样请求蜂拥而至。

那么,消息队列具体实现有哪些呢?

  • RabbitMQ - 性能很强,吞吐量很高,支持多种协议,集群化,消息的可靠执行特性等优势,很适合企业的开发。
  • Kafka - 提供了超高的吞吐量,ms 级别的延迟,极高的可用性以及可靠性,而且分布式可以任意扩展。
  • RocketMQ - 阿里巴巴推出的消息队列,经历过双十一的考验,单机吞吐量高,消息的高可靠性,扩展性强,支持事务等,但是功能不够完整,语言支持性较差。

我们这里,主要讲解的是 RabbitMQ 消息队列。

回到目录…

二、RabbitMQ 是什么?

官方网站:https://www.rabbitmq.com

RabbitMQ 是一个由 Erlang 语言开发的 AMQP 的开源实现。 ​ AMQP :Advanced Message Queue,高级消息队列协议。它是应用层协议的一个开放标准,为面向消息的中间件设计,基于此协议的客户端与消息中间件可传递消息,并不受产品、开发语言等条件的限制。 ​ RabbitMQ 最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

  • RabbitMQ 拥有数万计的用户,是最受欢迎的开源消息队列之一,从 T-Mobile 到 Runtastic,RabbitMQ 在全球范围内用于小型初创企业和大型企业。
  • RabbitMQ 轻量级,易于在本地和云端部署,它支持多种消息协议。RabbitMQ 可以部署在分布式和联合配置中,以满足大规模、高可用性要求。
  • RabbitMQ 在许多操作系统和云环境中运行,并为大多数流行语言提供了广泛的开发者工具。

具体特点:

  1. 可靠性(Reliability) ​ RabbitMQ 使用一些机制来保证可靠性,如持久化、传输确认、发布确认。

  2. 灵活的路由(Flexible Routing) ​ 在消息进入队列之前,通过 Exchange 来路由消息的。对于典型的路由功能,RabbitMQ已经提供了一些内置的 Exchange 来实现。针对更复杂的路由功能,可以将多个Exchange 绑定在一起,也通过插件机制实现自己的 Exchange 。

  3. 消息集群(Clustering) ​ 多个 RabbitMQ 服务器可以组成一个集群,形成一个逻辑 Broker。

  4. 高可用(Highly Available Queues) ​ 队列可以在集群中的机器上进行镜像,使得在部分节点出问题的情况下队列仍然可用。

  5. 多种协议(Multi-protocol) ​ RabbitMQ 支持多种消息队列协议,比如 STOMP、MQTT 等等。

  6. 多语言客户端(Many Clients) ​ RabbitMQ 几乎支持所有常用语言,比如 Java、.NET、Ruby 等等。

  7. 管理界面(Management UI) ​ RabbitMQ 提供了一个易用的用户界面,使得用户可以监控和管理消息 Broker 的许多方面。

  8. 跟踪机制(Tracing) ​ 如果消息异常,RabbitMQ 提供了消息跟踪机制,使用者可以找出发生了什么。

  9. 插件机制(Plugin System) ​ RabbitMQ 提供了许多插件,来从多方面进行扩展,也可以编写自己的插件。

回到目录…

三、RabbitMQ 设计架构

初始 RabbitMQ 消息队列_第2张图片

  • 生产者(Publisher)和消费者(Consumer):不用多说了吧。
  • Channel:我们的客户端连接都会使用一个 Channel,再通过 Channel 去访问到 RabbitMQ 服务器,注意通信协议不是 http,而是 amqp 协议。
  • Exchange:类似于交换机一样的存在,会根据我们的请求,转发给相应的消息队列,每个队列都可以绑定到 Exchange 上,这样 Exchange 就可以将数据转发给队列了,可以存在很多个,不同的 Exchange 类型可以用于实现不同消息的模式。
  • Queue:消息队列本体,生产者所有的消息都存放在消息队列中,等待消费者取出。
  • Virtual Host:有点类似于环境隔离,不同环境都可以单独配置一个 Virtual Host,每个 Virtual Host 可以包含很多个 Exchange 和 Queue,每个 Virtual Host 相互之间不影响。

回到目录…

四、WebUI 操作 RabbitMQ

我们已经学习了在 不同环境下安装 RabbitMQ,那我们启动服务器后,就可以访问管理页面:http://1.15.76.95:15672

那么,我们现在可以在 RabbitMQ 的 Web 管理页面上,进行消息队列的操作和使用,以进一步深入了解 RabbitMQ。

4.1 虚拟主机 (Virtual Host)

查看Admin->Users信息No access 表示 admin用户还不能访问到任何虚拟主机。

初始 RabbitMQ 消息队列_第3张图片

②手动创建一个虚拟主机 /test

初始 RabbitMQ 消息队列_第4张图片
可以看到 All virtual hosts 中多了一条主机信息。
在这里插入图片描述
在 Users 中,也可以看到 admin 可以访问 /test
在这里插入图片描述

③可以为用户添加其它虚拟机的访问权限

初始 RabbitMQ 消息队列_第5张图片

回到目录…

4.2 交换机 (exchanges)

查看交换机列表,发现已经为我们的虚拟主机创建好 7 个预设交换机。

初始 RabbitMQ 消息队列_第6张图片


手动添加交换机
初始 RabbitMQ 消息队列_第7张图片

介绍 AMQP default 直连交换机

  • 第一个交换机是所有虚拟主机都会自带的一个默认交换机,并且此交换机不可删除。
  • 此交换机默认绑定到所有的消息队列,不能解绑。如果通过该交换机发送消息,那么消息的routingKey = Queue.Name 来路由转发。
  • 该交换机特性是持久化的,就算服务器重启,也会保留。如果不是持久化,那么一旦重启就会消失。实际上我们在列表中看到 D 的字样,所有自动生成的交换机都是持久化的。

初始 RabbitMQ 消息队列_第8张图片

介绍 amq.direct 直连交换机

  • 这个交换机和我们刚刚介绍的默认交换机类型一致,并且也是持久化的。
  • 我们可以看到它是具有绑定关系的,默认没有任何绑定,需要手动绑定消息队列。如果想向某个消息队列发送消息,必须绑定该队列,且消息的 routingKey = Queue.routingKey 寻找消息队列。

初始 RabbitMQ 消息队列_第9张图片


向绑定好的消息队列中,发布消息:
初始 RabbitMQ 消息队列_第10张图片

回到目录…

4.3 消息队列 (Queues)

①默认没有任何队列

初始 RabbitMQ 消息队列_第11张图片
添加队列后,多了一条信息显示:
在这里插入图片描述

②点击进入新建的 queue1 队列中

初始 RabbitMQ 消息队列_第12张图片

手动绑定交换机:
初始 RabbitMQ 消息队列_第13张图片

③发布/获取消息

发布消息:通过 amq.direct 交换机转发消息,或者点击队列的 Publish Message 选项直接发布
初始 RabbitMQ 消息队列_第14张图片

获取消息:点击队列的 Get Messages 选项
初始 RabbitMQ 消息队列_第15张图片
Ack Mode (应答模式,有4个选项):

  • Nack message requeue true拒绝消息,也就是说不会将消息从消息队列取出,并且重新排队,一次可以拒绝多个消息。
  • Ack message requeue false确认应答,确认后消息会从消息队列中移除,一次可以确认多个消息。
  • Reject message requeue true/false也是拒绝此消息,但是可以指定是否重新排队。

④删除/清空消息队列

在这里插入图片描述

回到目录…


总结:
提示:这里对文章进行总结:
本文是对RabbitMQ的学习,首先了解了什么是消息队列,又针对RabbitMQ学习了它的特点和设计架构,最后在RabbitMQ的Web管理页面进行了实践操作。之后的学习内容将持续更新!!!

你可能感兴趣的:(SpringCloud,java-rabbitmq,rabbitmq,java)