本文最后更新于 2024-04-21,欢迎来到我的Blog! https://www.zpeng.site/

RabbitMQ

1、RabbitMQ

简介

http://www.rabbitmq.com/

RabbitMQ是一款开源的消息代理软件,也称为消息队列。它实现了高级消息队列协议(AMQP),是一种面向消息的中间件,最初由Rabbit Technology Ltd. 开发,现在是Pivotal Software的一部分。RabbitMQ服务器是用Erlang语言编写的,而集群和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均有与代理接口通讯的客户端库。

常用场景

rabbitmq常见使用场景:解耦、异步、削峰

流量消峰

举个例子,如果订单系统最多能处理一万次订单,这个处理能力应付正常时段的下单时绰绰有余,正常时段我们下单一秒后就能返回结果。但是在高峰期,如果有两万次下单操作系统是处理不了的,只能限制订单超过一万后不允许用户下单。使用消息队列做缓冲,我们可以取消这个限制,把一秒内下的订单分散成一段时间来处理,这时有些用户可能在下单十几秒后才能收到下单成功的操作,但是比不能下单的体验要好。

简单来说: 就是在访问量剧增的情况下,但是应用仍然不能停,比如“双十一”下单的人多,但是淘宝这个应用仍然要运行,所以就可以使用消息中间件采用队列的形式减少突然访问的压力

应用解耦

以电商应用为例,应用中有订单系统、库存系统、物流系统、支付系统。用户创建订单后,如果耦合调用库存系统、物流系统、支付系统,任何一个子系统出了故障,都会造成下单操作异常。当转变成基于消息队列的方式后,系统间调用的问题会减少很多,比如物流系统因为发生故障,需要几分钟来修复。在这几分钟的时间里,物流系统要处理的内存被缓存在消息队列中,用户的下单操作可以正常完成。当物流系统恢复后,继续处理订单信息即可,中间用户感受不到物流系统的故障,提升系统的可用性。

异步处理

有些服务间调用是异步的,例如 A 调用 B,B 需要花费很长时间执行,但是 A 需要知道 B 什么时候可以执行完,以前一般有两种方式,A 过一段时间去调用 B 的查询 api 查询。或者 A 提供一个 callback api, B 执行完之后调用 api 通知 A 服务。

这两种方式都不是很优雅,使用消息总线,可以很方便解决这个问题,A 调用 B 服务后,只需要监听 B 处理完成的消息,当 B 处理完成后,会发送一条消息给 MQ,MQ 会将此消息转发给 A 服务。这样 A 服务既不用循环调用 B 的查询 api,也不用提供 callback api。同样 B 服务也不用做这些操作。A 服务还能及时的得到异步处理成功的消息。

核心概念

RabbitMQ的核心概念构成了其消息传递模型的基础,以下是RabbitMQ中的一些关键概念:

  1. 消息(Message)

    • 消息是传递的数据,它由消息体(payload)和一系列可选的属性组成,如消息头(headers)、交付模式(delivery mode,指明消息是否应持久化)等。

  2. 队列(Queue)

    • 队列是消息的缓冲区,存储着待处理的消息。消息在被消费之前一直保留在队列中。一个队列可以有多个消费者,但一条消息只能被一个消费者处理。

  3. 交换器(Exchange)

    • 交换器接收来自生产者的消息,并根据路由规则将消息路由到一个或多个队列。RabbitMQ提供了几种类型的交换器,包括direct(直连)、fanout(广播)、topic(主题)和headers(消息头)。

  4. 绑定(Binding)

    • 绑定是队列和交换器之间的关联规则,它定义了消息如何从交换器路由到队列。绑定可以包含一个路由键(routing key),用于匹配消息的路由键和绑定的路由键。

  5. 连接(Connection)

    • 连接是客户端与RabbitMQ服务器之间的TCP连接。客户端使用此连接来发送消息和接收响应。

  6. 通道(Channel)

    • 通道是连接中的一个虚拟通道,用于执行MQ的事务性操作,如消息的发送和接收。客户端通常可以在单个连接上创建多个通道,以提高并发性能。

  7. 消费者(Consumer)

    • 消费者是一个从队列中接收消息的客户端。消费者可以是推模式(Push)或拉模式(Pull),其中推模式是RabbitMQ将消息推送给消费者,而拉模式是消费者主动从RabbitMQ拉取消息。

  8. 生产者(Producer)

    • 生产者是一个发送消息到RabbitMQ的客户端。生产者通常不处理消息,而是将消息发送到交换器,然后由交换器根据路由规则将消息发送到队列。

  9. 虚拟主机(Virtual Hosts)

    • 虚拟主机提供了消息队列的逻辑分隔,允许多个不同的用户或应用程序共享同一RabbitMQ服务器,同时保持消息隔离。

  10. 声明(Declarations)

    • 在RabbitMQ中,声明是一种操作,用于创建或检查资源(如队列、交换器、绑定)的存在。例如,queue.declare用于声明一个队列。

  11. 持久化(Persistence)

    • RabbitMQ支持消息和队列的持久化,确保消息在系统崩溃或重启后不会丢失。

  12. 消息确认(Message Acknowledgment)

    • 消息确认机制允许消费者在成功处理消息后发送一个确认回RabbitMQ,这样RabbitMQ就知道可以安全地从队列中移除该消息了。

  13. 死信队列(Dead Letter Exchanges)

    • 如果消息不能被正确处理,可以被发送到一个特殊的队列中,这个队列被称为死信队列。这通常发生在消息被拒绝或者在队列中无法找到匹配的绑定时。

这些概念共同构成了RabbitMQ的基础架构,使其能够在分布式系统中安全、高效地处理异步消息传递。

工作流程

  1. 生产者发送消息到MQ交换机

  2. 交换机根据定义的绑定规则和传过来的key将消息放到不同队列中

  3. 消费者从队列中取出消息进行消费

工作模式

RabbitMQ支持多种工作模式,以满足不同的业务需求。以下是一些主要的工作模式:

  1. 简单队列模式(Simple Queue)

    • 在这个模式下,生产者将消息发送到队列,消费者从队列中获取消息。消息遵循FIFO(先进先出)原则,只能被一个消费者消费。这是最基本的工作模式。

  2. 工作队列模式(Work Queues)

    • 工作队列也称为任务队列,用于分配任务给多个工作者(消费者)。消息被发送到队列,多个消费者监听同一个队列,每个消息只能被一个消费者消费,实现负载均衡。

  3. 发布/订阅模式(Publish/Subscribe)

    • 在这个模式下,消息被发送到交换器,然后交换器将消息分发给绑定到该交换器的所有队列。每个队列可以有多个消费者,消息会被分发到所有订阅的队列,实现消息广播。

  4. 路由模式(Routing)

    • 也称为定向广播,在这个模式下,交换器根据路由键(Routing Key)将消息路由到特定的队列。每个队列绑定一个或多个路由键,只有当消息的路由键与队列的路由键匹配时,消息才会被路由到该队列。

  5. 主题模式(Topics)

    • 主题模式是路由模式的一种扩展,它使用通配符来匹配路由键。这允许更复杂的路由逻辑,比如可以根据消息的属性进行路由。

2、RabbitMQ安装

环境准备

确保你的Windows系统满足RabbitMQ的运行要求,如64位操作系统,至少4GB内存,以及至少10GB的可用磁盘空间。

下载Erlang

RabbitMQ依赖于Erlang环境,因此首先需要下载并安装Erlang。可以从Erlang官方网站下载适合Windows版本的Erlang安装包。

https://www.erlang.org/downloads

https://github.com/erlang/otp/releases

https://www.erlang-solutions.com/downloads/

版本对应关系

https://rabbitmq.com/docs/which-erlang

rabbitmq 3.1.2.12 erlang 26.0

安装Erlang

环境变量设置

变量名: ERLANG_HOME

变量值: D:\java\erlang\Erlang

下载RabbitMQ

https://repo.huaweicloud.com/rabbitmq-server/

https://github.com/rabbitmq/rabbitmq-website

https://github.com/rabbitmq/rabbitmq-server/releases

安装RabbitMQ

环境变量设置

变量名: ERLANG_HOME

变量值: D:\java\erlang\Erlang

path变量中配置添加

%RABBITQM_SERVER%\sbin

这样就可以在windows administrator启动的CMD窗口操控RabbitMQ服务了。不需要每次都定位到:D:\java\rabbitmq\rabbitmq_server-3.12.12\sbin

安装 rabbitmq_management

我们用命令查看一下RabbtitMQ的所有插件:

rabbitmq-plugins list

看到RabbtitMQ 罗列出来了很多插件

我们用下列命令安装rabbitmq_management插件,这款插件是可以可视化的方式查看RabbitMQ 服务器实例的状态,以及操控RabbitMQ服务器。

rabbitmq-plugins enable rabbitmq_management

访问管理界面

启动服务后,通过浏览器访问RabbitMQ的管理界面,通常地址为http://localhost:15672。使用默认的用户名guest和密码guest登录。

在浏览器中输入 http://localhost:15672/api/ 就可以看到 RabbitMQ Management HTTP API 文档,如下图: