RabbitMQ
本文最后更新于 2024-04-21,欢迎来到我的Blog! https://www.zpeng.site/
RabbitMQ
1、RabbitMQ
简介
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中的一些关键概念:
消息(Message):
消息是传递的数据,它由消息体(payload)和一系列可选的属性组成,如消息头(headers)、交付模式(delivery mode,指明消息是否应持久化)等。
队列(Queue):
队列是消息的缓冲区,存储着待处理的消息。消息在被消费之前一直保留在队列中。一个队列可以有多个消费者,但一条消息只能被一个消费者处理。
交换器(Exchange):
交换器接收来自生产者的消息,并根据路由规则将消息路由到一个或多个队列。RabbitMQ提供了几种类型的交换器,包括direct(直连)、fanout(广播)、topic(主题)和headers(消息头)。
绑定(Binding):
绑定是队列和交换器之间的关联规则,它定义了消息如何从交换器路由到队列。绑定可以包含一个路由键(routing key),用于匹配消息的路由键和绑定的路由键。
连接(Connection):
连接是客户端与RabbitMQ服务器之间的TCP连接。客户端使用此连接来发送消息和接收响应。
通道(Channel):
通道是连接中的一个虚拟通道,用于执行MQ的事务性操作,如消息的发送和接收。客户端通常可以在单个连接上创建多个通道,以提高并发性能。
消费者(Consumer):
消费者是一个从队列中接收消息的客户端。消费者可以是推模式(Push)或拉模式(Pull),其中推模式是RabbitMQ将消息推送给消费者,而拉模式是消费者主动从RabbitMQ拉取消息。
生产者(Producer):
生产者是一个发送消息到RabbitMQ的客户端。生产者通常不处理消息,而是将消息发送到交换器,然后由交换器根据路由规则将消息发送到队列。
虚拟主机(Virtual Hosts):
虚拟主机提供了消息队列的逻辑分隔,允许多个不同的用户或应用程序共享同一RabbitMQ服务器,同时保持消息隔离。
声明(Declarations):
在RabbitMQ中,声明是一种操作,用于创建或检查资源(如队列、交换器、绑定)的存在。例如,
queue.declare
用于声明一个队列。
持久化(Persistence):
RabbitMQ支持消息和队列的持久化,确保消息在系统崩溃或重启后不会丢失。
消息确认(Message Acknowledgment):
消息确认机制允许消费者在成功处理消息后发送一个确认回RabbitMQ,这样RabbitMQ就知道可以安全地从队列中移除该消息了。
死信队列(Dead Letter Exchanges):
如果消息不能被正确处理,可以被发送到一个特殊的队列中,这个队列被称为死信队列。这通常发生在消息被拒绝或者在队列中无法找到匹配的绑定时。
这些概念共同构成了RabbitMQ的基础架构,使其能够在分布式系统中安全、高效地处理异步消息传递。
工作流程
生产者发送消息到MQ交换机
交换机根据定义的绑定规则和传过来的key将消息放到不同队列中
消费者从队列中取出消息进行消费
工作模式
RabbitMQ支持多种工作模式,以满足不同的业务需求。以下是一些主要的工作模式:
简单队列模式(Simple Queue):
在这个模式下,生产者将消息发送到队列,消费者从队列中获取消息。消息遵循FIFO(先进先出)原则,只能被一个消费者消费。这是最基本的工作模式。
工作队列模式(Work Queues):
工作队列也称为任务队列,用于分配任务给多个工作者(消费者)。消息被发送到队列,多个消费者监听同一个队列,每个消息只能被一个消费者消费,实现负载均衡。
发布/订阅模式(Publish/Subscribe):
在这个模式下,消息被发送到交换器,然后交换器将消息分发给绑定到该交换器的所有队列。每个队列可以有多个消费者,消息会被分发到所有订阅的队列,实现消息广播。
路由模式(Routing):
也称为定向广播,在这个模式下,交换器根据路由键(Routing Key)将消息路由到特定的队列。每个队列绑定一个或多个路由键,只有当消息的路由键与队列的路由键匹配时,消息才会被路由到该队列。
主题模式(Topics):
主题模式是路由模式的一种扩展,它使用通配符来匹配路由键。这允许更复杂的路由逻辑,比如可以根据消息的属性进行路由。
2、RabbitMQ安装
环境准备
确保你的Windows系统满足RabbitMQ的运行要求,如64位操作系统,至少4GB内存,以及至少10GB的可用磁盘空间。
下载Erlang
RabbitMQ依赖于Erlang环境,因此首先需要下载并安装Erlang。可以从Erlang官方网站下载适合Windows版本的Erlang安装包。
https://www.erlang.org/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/
安装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 文档,如下图:
- 感谢你赐予我前进的力量