RabbitMQ概述和工作模式

发布于:2025-07-19 ⋅ 阅读:(14) ⋅ 点赞:(0)

RabbitMQ概述

MQ的介绍

MQ( Message queue )是指消息队列

MQ多用于分布式系统之间进行通信

系统之间的调用有两种方式:

  1. 同步通信

直接调用对方的服务,数据从一端发出后可直接到达另一端

在这里插入图片描述

  1. 异步通信

数据从一端发出后,先进入一个容器进行临时存储,当达到一定条件,再由这个容器发送到另一端

在这里插入图片描述

MQ的作用

主要作用是用来接收并转发消息
举例说明
可以把MQ想象成⼀个仓库.采购部门进货之后,把零件放进仓库里,生产部门从仓库中取出零件,并加工成产品.
在这里插入图片描述

MQ里存放的是消息

  1. 异步解耦: 在业务流程中,⼀些操作可能非常耗时,但并不需要即时返回结果.可以借助MQ把这些操作异步化
    比如抽奖后中奖需要发送中奖通知,使用短信或者邮件通知,可以作异步任务处理,而不用等待这些操作完成才告诉用户已中奖
  2. 流量削峰:在访问量剧增的情况下,如果以能处理这类峰值为标准而投入资源,无疑是巨大的浪费.
    比如秒杀或者促销活动,可以使用MQ控制流量,将请求排队,然后系统根据自己的处理能力逐步处理请求
  3. 消息多发:当多个系统需要对同⼀数据做出响应时,可以使用MQ进行消息分发.
    比如支付成功后,支付系统可以向MQ发送消息,其他系统订阅该消息,而无需轮询数据库.
  4. 延迟通知:在需要在特定时间后发送通知的场景中,可以使用MQ的延迟消息功能.
    比如在电子商务平台中,如果用户单后⼀定时间内未支付,可以使用延迟队列在超时后自动取消订单

RabbitMQ 就是MQ的⼀种实现

RabbitMQ介绍

RabbitMQ官网:RabbitMQ

RabbitMQ是采用Erlang语言实现AMQP(Advanced Message Queuing Protocol,高级消息队列协议)的消息中间件,它最初起源于金融系统领域,为了在分布式系统中存储和转发消息而设计的.

在此之前,有⼀些消息中间件的商业实现,比如微软的MSMQ(MicroSoft Message Queue),IBM的WebSphere等. 但是他们价格太贵了,⼀般只应用于大型组织机构.RabbitMQ开发始于2006年,是由Rabbit Technologies开发并且提供商持的.

之所以取名为Rabbit,是因为兔子行动非常迅速且繁殖起来非常疯狂,RabbitMQ的开创者认为这个名字再合适不过
了.
2010年4月,Rabbit Technologies被VMware旗下的SpringSource收购,在2013年5月被并入Pivotal.

其实VMware,Pivotal本质上是⼀家的.不同的是, VMware是独立上市子公司,而Pivotal是整合了EMC的某些资源,其中我们现在使用的Spring系列框架,就是Pivotal公司门的产品之⼀。

直到后来Pivotal将其开源,RabbitMQ才逐渐走向大众!
RabbitMQ发展到今天,已经被越来越多的人认可,尤其是互联网公司,已经有着大规模的场景应用,这和它在易用性,扩展性,可靠性高可用性等方面的卓越表现是分不开的.接下来我们就⼀起来深入解⼀下RabbitMQ.

RabbitMQ核心概念

Ubuntu环境下安装

RabbitMQ大多部署在Linux操作系统
⼀.安装Erlang
RabbitMq需要Erlang语言的支持,在安装rabbitMq之前需要安装erlang

#更新软件包
sudo apt-get update
#安装erlang
sudo apt-get install erlang

查看erlang版本

root@hcss-ecs-895b:~# erl
Erlang/OTP 25 [erts-13.2.2.5] [source] [64-bit] [smp:2:2] [ds:2:2:10] [async-threads:1] [jit:ns]

Eshell V13.2.2.5  (abort with ^G)

退出命令:

halt().

二.安装RabbitMQ

#更新软件包
sudo apt-get update
#安装rabbitmq
sudo apt-get install rabbitmq-server
#确认安装结果
systemctl status rabbitmq-server

三.安装RabbitMQ管理界面

rabbitmq-plugins enable rabbitmq_management

四.启动服务并访问

#启动rabbitmq
sudo service rabbitmq-server start

查看服务状态

systemctl status rabbitmq-server

通过IP:port 访问界面

15672为默认端口号,云服务器需要开启端口
默认用户名和密码都是:guest

添加管理员用户

# rabbitmqctl add_user ${账号} ${密码}
abbitmqctl add_user admin admin

给用户添加权限

#rabbitmqctl set_user_tags ${账号} ${角色名称}

rabbitmqctl set_user_tags admin administrator

通过IP:port访问,并使用刚才设置的用户名和密码登录

概念介绍

Producer和Consumer

Producer:生产者,向RabbitMQ发送消息
Consumer: 消费者,从RabbitMQ接收消息
Broker:其实就是RabbitMQ Server,主要是接收和收发消息

消息通常是⼀个带有⼀定业务逻辑结构的数据,比如JSON字符串.消息可以带有⼀定的标签,RabbitMQ会根据标签进行路由,把消息发送给感兴趣的消费者(Consumer).

消费者连接到RabbitMQ服务器,就可以消费消息了,消费的过程中,标签会被丢掉.消费者只会收到消息,并不知道消息的生产者是谁
在这里插入图片描述

Connection和Chanel

Connection: 连接.是客户端和RabbitMQ服务器之间的⼀个TCP连接.

这个连接是建立消息传递的基础,它负责传输客⼾端和服务器之间的所有数据和控制信息.

Channel: 通道, 信道.Channel是在Connection之上的⼀个抽象层.

在RabbitMQ中,⼀个TCP连接可以有多个Channel,每个Channel都是独立的虚拟连接.消息的发送和接收都是基于Channel的.

通道的主要作用是将消息的读写操作复用到同⼀个TCP连接上,这样可以减少建立和关闭连接的开销,提高性能.
在这里插入图片描述

Virtual host

Virtual host: 虚拟主机.它为消息队列提供了⼀种逻辑上的隔离机制.对于RabbitMQ,⼀个BrokerServer上可以存在多个Virtual Host.当多个不同的用户使用同⼀个RabbitMQ Server提供的服务时,可以虚拟划分出多个vhost,每个用户在自己的vhost创建exchange/queue等

类似MySQL的"database",是⼀个逻辑上的集合.⼀个MySQL服务器可以有多个database.

Queue

Queue:队列,是RabbitMQ的内部对象,用于存储消息.

多个消费者,可以订阅同⼀个队列
在这里插入图片描述

Exchange

Exchange:交换机.message到达broker的第⼀站,它负责接收生产者发送的消息,并根据特定的规则把这些消息路由到⼀个或多个Queue列中.

Exchange起到了消息路由的作用,它根据类型和规则来确定如何转发接收到的消息.

类似于发快递之后,物流公司怎么处理呢,根据咱们的地址来分派这个快递到不同的站点,然后再送到收件人手里,这个分配的工作,就是交换机来做的

在这里插入图片描述

工作流程

在这里插入图片描述
RabbitMQ是⼀个消息中间件,也是⼀个生产者消费者模型.它负责接收,存储并转发消息.

类似于邮局 当你要发送⼀个邮件时,你把你的邮件放到邮局,邮局接收邮件,并通过邮递员送到收件人的手上.

在这里插入图片描述

  1. Producer生产了⼀条消息
  2. Producer 连接到RabbitMQBroker,建立⼀个连接(Connection),开启⼀个信道(Channel)
  3. Producer 声明⼀个交换机(Exchange),路由消息
  4. Producer 声明⼀个队列(Queue),存放信息
  5. Producer 发送消息到RabbitMQ Broker
  6. RabbitMQ Broker接收消息,并存入相应的队列(Queue)中,如果未找到相应的队列,则根据生产者
    的配置,选择丢弃或者退回给生产者.

AMQP协议介绍

AMQP(Advanced Message Queuing Protocol)是⼀种高级消息队列协议,AMQP定义了⼀套确定的消息交换功能,包括交换器(Exchange),队列(Queue)等.

这些组件共同工作,使得生产者能够将消息发送到交换器.然后由队列接收并等待消费者接收.

AMQP还定义了⼀个网络协议,允许客户端应用通过该协议与消息代理和AMQP模型进行交互通信

RabbitMQ是遵从AMQP协议的,换句话说,RabbitMQ就是AMQP协议的Erlang的实现(当然RabbitMQ还支持STOMP2,MQTT2等议).AMQP的模型结构和RabbitMQ的模型结构是⼀样的.

RabbitMQ的工作模式

Simple(简单模式)

请添加图片描述

特点:一个生产者,一个消费者,消息只能被消费一次(点对点模式)

适用场景:消息只能被单个消费者处理

使用内置的交换机,发送消息时routingkey和队列名称要一致

Work Queue(工作队列)

请添加图片描述

特点:消息不会重复,分配给不同的消费者.

适用场景: 集群环境中做异步处理

比如12306短信通知服务,订票成功后,订单消息会发送到RabbitMQ,短信服务从RabbitMQ中获取订单 信息,并发送通知信息(在短信服务之间进行任务分配)

步骤和简单模式差不多,不同的是多个消费者消费信息

Publish/Subscribe(发布/订阅)

请添加图片描述

Exchange:交换机

生产者将消息发送到Exchange,由交换机将信息按一定规则路由到一个或多个队列,

RabbitMQ交换机有四种类型: fanout,direct,topic,headers,不同类型有着不同的路由策略

  1. Fanout :广播,将消息交给所有绑定到交换机的队列(Publish/Subscribe(发布/订阅))

  2. Direct :定向,把消息交给符合指定routingkey的队列(Routing模式)

  3. Topic :通配符,把消息交给符合routingpattern(路由模式)的队列(Topics模式)

  4. headers类型的交换器不依赖于路由键的匹配规则来路由消息,而是根据发送的消息内容中的 headers属性进行匹配

Exchange只负责转发消息,不具备存储消息的功能,如果没有队列 与交换机绑定或则没有符合路由规则的队列,消息就会丢失

RoutingKey: 路由键. 生产者将消息发给交换器时,指定的⼀个字符串,用来告诉交换机应该如何处理这个消息. BindingKey: 绑定. RabbitMQ中通过Binding(绑定)将交换器与队列关联起来,在绑定的时候⼀般会指 定一个BindingKey,这样RabbitMQ就知道如何正确地将消息路由到队列了.

请添加图片描述

Publish/Subscribe模式

特点:生产者发送⼀条消息,经过交换机转发到多个不同的队列,多个不同的队列就有多个不同的消费者

适合场景: 消息需要被多个消费者同时接收的场景.如:实时通知或者广播消息

比如中国气象局发布"天气预报"的消息送入交换机,新浪,百度,搜狐,网易等门户网站接入消息,通过 队列绑定到该交换机,自动获取气象局推送的气象数据

Routing(路由模式)

请添加图片描述

路由模式是发布订阅模式的变种

特点:Exchange根据RoutingKey的规则, 将数据筛选后发给对应的消费者队列

适合场景:需要根据特定规则分发消息的场景.

比如系统打印日志,日志等级分为error,warning,info,debug,就可以通过这种模式,把不同的日志发 送到不同的队列,最终输出到不同的文件

Topics(通配符模式)

请添加图片描述

路由模式的升级版,在routingKey的基础上,增加了通配符的功能,使之更加灵活.

Topics和Routing的基本原理相同

不同之处是:routingKey的匹配方式不同,Routing模式是相等匹配,topics模式是通配符匹配.

适合场景:需要灵活匹配和过滤消息的场景

RPC(RPC通信)

请添加图片描述
在RPC通信的过程中,没有生产者和消费者,比较像咱们RPC远程调用,大概就是通过两个队列实现了⼀个可回调的过程.

请添加图片描述

  1. 客户端发送消息到⼀个指定的队列,并在消息属性中设置replyTo字段,这个字段指定了一个回调队列,用于接收服务端的响应.

  2. 服务端接收到请求后,处理请求并发送响应消息到replyTo指定的回调队列

  3. 客户端在回调队列上等待响应消息.一旦收到响应,客户端会检查消息的correlationId属性,以确保它是所期望的响应.

PublisherConfirms(发布确认)

确保消息可靠发送到RabbitMQ服务器的机制
请添加图片描述

  1. 生产者将Channel设置为confirm模式(通过调用channel.confirmSelect()完成)后,发布的每⼀条消 息都会获得一个唯一的ID,生产者可以将这些序列号与消息关联起来,以便跟踪消息的状态.

  2. 当消息被RabbitMQ服务器接收并处理后,服务器会异步地向生产者发送一个确认(ACK)给生产者 (包含消息的唯一ID),表明消息已经送达.

适用场景:对数据安全性要求较高的场景.
比如金融交易,订单处理.


网站公告

今日签到

点亮在社区的每一天
去签到