RabbitMQ概述和工作模式

文章目录

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

java 复制代码
#更新软件包
sudo apt-get update
#安装erlang
sudo apt-get install erlang

查看erlang版本

java 复制代码
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)

退出命令:

java 复制代码
halt().

二.安装RabbitMQ

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

三.安装RabbitMQ管理界面

java 复制代码
rabbitmq-plugins enable rabbitmq_management

四.启动服务并访问

java 复制代码
#启动rabbitmq
sudo service rabbitmq-server start

查看服务状态

java 复制代码
systemctl status rabbitmq-server

通过IP:port 访问界面

15672为默认端口号,云服务器需要开启端口

默认用户名和密码都是:guest

添加管理员用户

java 复制代码
# rabbitmqctl add_user ${账号} ${密码}
abbitmqctl add_user admin admin

给用户添加权限

java 复制代码
#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),表明消息已经送达.

适用场景:对数据安全性要求较高的场景.

比如金融交易,订单处理.

相关推荐
用户8307196840822 天前
RabbitMQ vs RocketMQ 事务大对决:一个在“裸奔”,一个在“开挂”?
后端·rabbitmq·rocketmq
初次攀爬者3 天前
RabbitMQ的消息模式和高级特性
后端·消息队列·rabbitmq
初次攀爬者5 天前
ZooKeeper 实现分布式锁的两种方式
分布式·后端·zookeeper
让我上个超影吧6 天前
消息队列——RabbitMQ(高级)
java·rabbitmq
塔中妖6 天前
Windows 安装 RabbitMQ 详细教程(含 Erlang 环境配置)
windows·rabbitmq·erlang
断手当码农6 天前
Redis 实现分布式锁的三种方式
数据库·redis·分布式
初次攀爬者6 天前
Redis分布式锁实现的三种方式-基于setnx,lua脚本和Redisson
redis·分布式·后端
业精于勤_荒于稀6 天前
物流订单系统99.99%可用性全链路容灾体系落地操作手册
分布式
Ronin3056 天前
信道管理模块和异步线程模块
开发语言·c++·rabbitmq·异步线程·信道管理
Asher05096 天前
Hadoop核心技术与实战指南
大数据·hadoop·分布式