消息队列之RabbitMQ介绍

系列文章目录

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加

消息队列之RabbitMQ介绍


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前言

提示:这里可以添加本文要记录的大概内容:

在当今的分布式系统和微服务架构中,消息队列扮演着至关重要的角色。它们为应用程序提供了一种可靠的异步通信机制,使得各个组件之间能够高效地传递消息和协调工作。而在众多的消息队列技术中,RabbitMQ 无疑是一个备受关注和广泛应用的佼佼者。

RabbitMQ 是一个开源的消息队列服务器,它基于 AMQP(Advanced Message Queuing Protocol)协议实现。通过使用 RabbitMQ,开发人员可以轻松地实现应用程序之间的消息传递、异步处理和流量削峰等功能。它具有高度的可靠性、灵活性和可扩展性,能够处理大量的消息并发,并支持多种编程语言和客户端。

在本博客中,我将带领大家深入了解 RabbitMQ 的世界。我们将探讨 RabbitMQ 的核心概念、工作原理以及它的一些重要特性。我还将分享一些实际的使用场景和最佳实践,帮助你更好地理解如何将 RabbitMQ 应用于你的项目中。

无论你是一名经验丰富的开发人员,还是刚刚开始接触消息队列的新手,我相信本博客都能为你提供有价值的信息和启发。让我们一起探索 RabbitMQ 的魅力,掌握它的强大功能,为构建高效、可靠的应用程序迈出坚实的一步!


提示:以下是本篇文章正文内容,下面案例可供参考

一、RabbitMQ介绍

消息队列

MQ是Message Queue的简称,也就是消息队列,消息队列是用来消息传递的过程中储存消息的容器。应用于异步通信,

消息

消息是指两台计算机间传递的数据单位。消息可以是简单的字符串,也可以是复杂的对象。

队列

队列是数据结构中的概念。队列中的数据有先进先出、后进后出的特点。

RabbitMQ

RabbitMQ 是一个开源的消息队列服务器,基于 AMQP(Advanced Message Queuing Protocol)协议实现,它提供了可靠的消息传递机制,可以确保消息不会丢失。

RabbitMQ 具有高度的灵活性,支持多种消息传递模式,如点对点、发布/订阅等,以满足不同的应用场景。同时,它还支持多种编程语言和客户端,并提供了广泛的客户端库,方便开发人员进行开发。

在处理更高的消息吞吐量和更多的连接时,RabbitMQ 可以轻松扩展。它提供了丰富的文档和资源,方便用户学习和解决问题,并且拥有一个活跃的社区,可以提供技术支持和交流。

二、使用Rabbit MQ的优势

解耦应用

通过使用消息队列,应用程序的不同组件可以松耦合地通信,而无需直接相互依赖。这有助于提高应用的灵活性和可维护性。

举个例子:考虑一个电子商务网站的订单处理系统。当用户在网站上下订单时,订单系统需要将订单信息发送给库存系统以检查商品库存,同时将订单信息发送给支付系统以处理支付。如果订单系统直接与库存系统和支付系统进行通信,那么它们之间就会产生紧耦合。

使用 RabbitMQ,订单系统可以将订单消息发送到一个队列中,而库存系统和支付系统可以作为消费者从队列中接收订单消息并进行处理。这样,订单系统不再直接与库存系统和支付系统进行通信,而是通过消息队列进行解耦。

这种解耦的好处是,当库存系统或支付系统需要升级或维护时,订单系统不会受到影响。它们可以继续发送订单消息到队列中,而库存系统和支付系统可以在之后的时间处理这些消息。此外,如果订单量突然增加,队列可以起到缓冲的作用,确保库存系统和支付系统不会被瞬间的高流量淹没。

异步处理

RabbitMQ 允许应用程序进行异步处理,从而提高系统的响应性和并发处理能力。发送方可以将消息发送到队列后立即返回,而接收方可以在之后的时间处理消息。

流量削峰

在高并发或突发流量的情况下,RabbitMQ 可以作为缓冲区来吸收和处理大量的消息。它可以帮助系统抵御瞬间的峰值负载,避免应用程序崩溃或性能下降。

高可靠性

RabbitMQ 提供了可靠的消息传递机制,确保消息不会丢失。即使在发送方或接收方出现故障的情况下,消息也可以被存储在队列中,并在系统恢复后重新处理。

三、使用Rabbit MQ的劣势

  • 系统可用性降低 系统引入的外部依赖越多,系统稳定性越差。一旦MQ宕机,就会对业务造成影响。
  • 系统复杂度提高 MQ的加入大大增加了系统的复杂度,以前系统间是同步的远程调用,现在是通过MQ进行异步调用。
  • 一致性问题 A系统处理完业务,通过MQ给B、C、D三个系统发消息数据,如果B系统、C系统处理成功,D系统处理失败,则会造成数据处理的不一致。

四、RabbitMQ的应用场景

秒杀活动

对于抢红包、抢车票等秒杀活动,一瞬间便会有大量请求打过来,如果直接处理,会浪费很多资源,我们可以先将请求放到MQ中,先请求的秒杀成功,后请求的秒杀失败。

消息分发

如电商网站要推送促销信息,该业务耗费时间较多,但对时效性要求不高,可以使用MQ做消息分发。

数据同步

假如我们需要将数据保存到数据库之外,还需要一段时间将数据同步到缓存(如Redis)、搜索引擎(如Elasticsearch)中。此时可以将数据库的数据作为消息发送到MQ中,并同步到缓存、搜索引擎中。

异步处理

在电商系统中,订单完成后,需要及时的通知子系统(进销存系统发货,用户服务积分,发送短信)进行下一步操作。为了保证订单系统的高性能,应该直接返回订单结果,之后让MQ通知子系统做其他非实时的业务操作。这样能保证核心业务的高效及时。

五、RabbitMQ的工作原理

  • 生产者(Producer):生产者将消息发送到 RabbitMQ 队列中。生产者可以是应用程序或服务,它们将消息发送到 RabbitMQ 队列以进行后续处理。
  • 连接(Connection):生产者/消费者和RabbitMQ服务器之间建立的TCP连接。
  • 信道(Channel):是TCP里面的虚拟连接。例如:Connection相当于电缆,Channel相当于独立光纤束,一条TCP连接中可以创建多条信道,增加连接效率。无论是发布消息、接收消息、订阅队列都是通过信道完成的。
  • Broker:消息队列服务器实体。即RabbitMQ服务器
  • Virtual host:虚拟主机。出于多租户和安全因素设计的,把AMQP的基本组件划分到一个虚拟的分组中。每个vhost本质上就是一个mini版的RabbitMQ服务器,拥有自己的队列、交换机、绑定和权限机制。当多个不同的用户使用同一个RabbitMQ服务器时,可以划分出多个虚拟主机。RabbitMQ默认的虚拟主机路径是/。
  • 交换机(Exchange):交换机是RabbitMQ 中的一个组件,用于将消息从生产者发送到队列。交换机可以根据消息的内容或属性将其发送到不同的队列中。
  • 队列(Queue):RabbitMQ 队列是一个存储消息的容器。队列可以被多个消费者同时消费,消息在队列中按照先进先出(FIFO)的原则进行存储。
  • 绑定(Binding):绑定是RabbitMQ 中的一个配置,用于将交换机和队列关联起来。通过绑定,生产者可以将消息发送到特定的交换机,而交换机则可以将消息转发到指定的队列中。
  • 消费者(Consumer):消费者从 RabbitMQ 队列中获取消息并进行处理。消费者可以是应用程序或服务,它们从队列中获取消息并进行后续的处理或存储。

当生产者将消息发送到 RabbitMQ 时,它会将消息发送到指定的交换机。交换机根据绑定规则将消息转发到相应的队列中。然后,消费者从队列中获取消息并进行处理。整个过程是异步的,生产者和消费者不需要等待对方完成操作,而是可以继续进行自己的工作。

六、RabbitMQ的使用

因为RabbitMQ是使Erlang编写的,所以使用RabbitMQ需要安装Erlanghuanjing

安装Erlang环境

1.安装Erlang所需的依赖

bash 复制代码
yum install -y epel-release

2.添加存储库条目

bash 复制代码
wget https://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpm 
rpm -Uvh erlang-solutions-1.0-1.noarch.rpm

3.安装Erlang

bash 复制代码
yum install -y erlang

4.查看Erlang是否安装成功

bash 复制代码
erl -version

安装RabbitMQ

1.为了外部能够正常访问RabbitMQ服务,先关闭防火墙

bash 复制代码
# 关闭运行的防火墙
systemctl stop firewalld.service
# 禁止防火墙自启动
systemctl disable firewalld.service

2.RabbitMQ是通过主机名进行访问的,必须给服务器添加主机名

bash 复制代码
# 修改文件
vim /etc/sysconfig/network
# 添加如下内容
NETWORKING=yes
HOSTNAME=itbaizhan


# 修改文件
vim /etc/hosts
# 添加如下内容
服务器ip zhangsan

3.在Windos中下载RabbitMQ压缩包(大家去网上找),使用rz命令从Windos上传到Linux(虚拟机)中。

4.安装RabbitMQ

bash 复制代码
# 解压RabbitMQ
tar xf rabbitmq-server-generic-unix-3.9.13.tar.xz


# 重命名:
mv rabbitmq_server-3.9.13 rabbitmq


# 移动文件夹:
mv rabbitmq /usr/local/

5.配置环境变量

bash 复制代码
# 编辑/etc/profile文件
vim /etc/profile


#添加如下内容
export PATH=$PATH:/usr/local/rabbitmq/sbin


# 运行文件,让修改内容生效
source /etc/profile

6.开启管控台插件

bash 复制代码
rabbitmq-plugins enable rabbitmq_management

7.后台运行

bash 复制代码
# 创建配置文件夹
mkdir -p /usr/local/rabbitmq/etc/rabbitmq
# 创建配置文件
vim /usr/local/rabbitmq/etc/rabbitmq/rabbitmq.conf
# 添加如下内容
loopback_users=none


# 重启RabbitMQ
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app

8.通过管控台访问RabbitMQ,路径:http://ip地址:15672,用户名:guest,密码:guest

9.此时会提示guest账户只允许本地使用,我们可以配置允许使用guest远程访问

bash 复制代码
# 创建配置文件夹
mkdir -p /usr/local/rabbitmq/etc/rabbitmq
# 创建配置文件
vim /usr/local/rabbitmq/etc/rabbitmq/rabbitmq.conf
# 添加如下内容
loopback_users=none


# 重启RabbitMQ
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app

Dockers安装RabbitMQ

1.在虚拟机中安装docker

bash 复制代码
# 安装Docker
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun


# 启动docker
systemctl start docker

2.拉取镜像

bash 复制代码
docker pull rabbitmq

3.启动RabbitMQ容器

bash 复制代码
docker run -d --hostname zhangsan --name rabbit -p 15672:15672 -p 5672:5672 rabbitmq

4.开启管控台插件

bash 复制代码
# 查询rabbitmq容器ID
docker ps 
# 进入容器
docker exec -it 容器ID /bin/bash 
# 开启管控台插件
rabbitmq-plugins enable rabbitmq_management
# 退出容器
ctrl+p+q

5.通过管控台访问rabbitmq,路径:http://ip地址:15672,用户名:guest,密码:guest

6.关闭RabbitMQ容器

bash 复制代码
docker stop rabbit

账户管理

guest账户默认只允许本地使用,我们可以创建新账户远程访问RabbitMQ

1.创建账户

bash 复制代码
# 创建账户
rabbitmqctl add_user 用户名 密码

2.给用户授予管理员角色

bash 复制代码
rabbitmqctl set_user_tags 用户名 administrator

3.给用户授权

bash 复制代码
# "/"表示虚拟机
# itbaizhan表示用户名
# ".*" ".*" ".*" 表示完整权限
rabbitmqctl set_permissions -p "/" itbaizhan ".*" ".*" ".*"

总结

提示:这里对文章进行总结:

RabbitMQ 是一个强大而灵活的消息队列解决方案,能够帮助应用程序实现高性能、可靠的异步通信和数据处理。

相关推荐
只因在人海中多看了你一眼1 小时前
分布式缓存 + 数据存储 + 消息队列知识体系
分布式·缓存
zhixingheyi_tian3 小时前
Spark 之 Aggregate
大数据·分布式·spark
求积分不加C5 小时前
-bash: ./kafka-topics.sh: No such file or directory--解决方案
分布式·kafka
nathan05295 小时前
javaer快速上手kafka
分布式·kafka
谭震鸿8 小时前
Zookeeper集群搭建Centos环境下
分布式·zookeeper·centos
天冬忘忧13 小时前
Kafka 工作流程解析:从 Broker 工作原理、节点的服役、退役、副本的生成到数据存储与读写优化
大数据·分布式·kafka
尽兴-17 小时前
Redis模拟延时队列 实现日程提醒
java·redis·java-rocketmq·mq
IT枫斗者18 小时前
如何解决Java EasyExcel 导出报内存溢出
java·服务器·开发语言·网络·分布式·物联网
求积分不加C18 小时前
Kafka怎么发送JAVA对象并在消费者端解析出JAVA对象--示例
java·分布式·kafka·linq
GDDGHS_19 小时前
“Kafka面试攻略:核心问题与高效回答”
分布式·面试·kafka