提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
消息队列之RabbitMQ介绍
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
提示:这里可以添加本文要记录的大概内容:
在当今的分布式系统和微服务架构中,消息队列扮演着至关重要的角色。它们为应用程序提供了一种可靠的异步通信机制,使得各个组件之间能够高效地传递消息和协调工作。而在众多的消息队列技术中,RabbitMQ 无疑是一个备受关注和广泛应用的佼佼者。
RabbitMQ 是一个开源的消息队列服务器,它基于 AMQP(Advanced Message Queuing Protocol)协议实现。通过使用 RabbitMQ,开发人员可以轻松地实现应用程序之间的消息传递、异步处理和流量削峰等功能。它具有高度的可靠性、灵活性和可扩展性,能够处理大量的消息并发,并支持多种编程语言和客户端。
在本博客中,我将带领大家深入了解 RabbitMQ 的世界。我们将探讨 RabbitMQ 的核心概念、工作原理以及它的一些重要特性。我还将分享一些实际的使用场景和最佳实践,帮助你更好地理解如何将 RabbitMQ 应用于你的项目中。
无论你是一名经验丰富的开发人员,还是刚刚开始接触消息队列的新手,我相信本博客都能为你提供有价值的信息和启发。让我们一起探索 RabbitMQ 的魅力,掌握它的强大功能,为构建高效、可靠的应用程序迈出坚实的一步!
提示:以下是本篇文章正文内容,下面案例可供参考
MQ是Message Queue的简称,也就是消息队列,消息队列是用来消息传递的过程中储存消息的容器。应用于异步通信,
消息是指两台计算机间传递的数据单位。消息可以是简单的字符串,也可以是复杂的对象。
队列是数据结构中的概念。队列中的数据有先进先出、后进后出的特点。
RabbitMQ 是一个开源的消息队列服务器,基于 AMQP(Advanced Message Queuing Protocol)协议实现,它提供了可靠的消息传递机制,可以确保消息不会丢失。
RabbitMQ 具有高度的灵活性,支持多种消息传递模式,如点对点、发布/订阅等,以满足不同的应用场景。同时,它还支持多种编程语言和客户端,并提供了广泛的客户端库,方便开发人员进行开发。
在处理更高的消息吞吐量和更多的连接时,RabbitMQ 可以轻松扩展。它提供了丰富的文档和资源,方便用户学习和解决问题,并且拥有一个活跃的社区,可以提供技术支持和交流。
通过使用消息队列,应用程序的不同组件可以松耦合地通信,而无需直接相互依赖。这有助于提高应用的灵活性和可维护性。
举个例子:考虑一个电子商务网站的订单处理系统。当用户在网站上下订单时,订单系统需要将订单信息发送给库存系统以检查商品库存,同时将订单信息发送给支付系统以处理支付。如果订单系统直接与库存系统和支付系统进行通信,那么它们之间就会产生紧耦合。
使用 RabbitMQ,订单系统可以将订单消息发送到一个队列中,而库存系统和支付系统可以作为消费者从队列中接收订单消息并进行处理。这样,订单系统不再直接与库存系统和支付系统进行通信,而是通过消息队列进行解耦。
这种解耦的好处是,当库存系统或支付系统需要升级或维护时,订单系统不会受到影响。它们可以继续发送订单消息到队列中,而库存系统和支付系统可以在之后的时间处理这些消息。此外,如果订单量突然增加,队列可以起到缓冲的作用,确保库存系统和支付系统不会被瞬间的高流量淹没。
RabbitMQ 允许应用程序进行异步处理,从而提高系统的响应性和并发处理能力。发送方可以将消息发送到队列后立即返回,而接收方可以在之后的时间处理消息。
在高并发或突发流量的情况下,RabbitMQ 可以作为缓冲区来吸收和处理大量的消息。它可以帮助系统抵御瞬间的峰值负载,避免应用程序崩溃或性能下降。
RabbitMQ 提供了可靠的消息传递机制,确保消息不会丢失。即使在发送方或接收方出现故障的情况下,消息也可以被存储在队列中,并在系统恢复后重新处理。
对于抢红包、抢车票等秒杀活动,一瞬间便会有大量请求打过来,如果直接处理,会浪费很多资源,我们可以先将请求放到MQ中,先请求的秒杀成功,后请求的秒杀失败。
如电商网站要推送促销信息,该业务耗费时间较多,但对时效性要求不高,可以使用MQ做消息分发。
假如我们需要将数据保存到数据库之外,还需要一段时间将数据同步到缓存(如Redis)、搜索引擎(如Elasticsearch)中。此时可以将数据库的数据作为消息发送到MQ中,并同步到缓存、搜索引擎中。
在电商系统中,订单完成后,需要及时的通知子系统(进销存系统发货,用户服务积分,发送短信)进行下一步操作。为了保证订单系统的高性能,应该直接返回订单结果,之后让MQ通知子系统做其他非实时的业务操作。这样能保证核心业务的高效及时。
当生产者将消息发送到 RabbitMQ 时,它会将消息发送到指定的交换机。交换机根据绑定规则将消息转发到相应的队列中。然后,消费者从队列中获取消息并进行处理。整个过程是异步的,生产者和消费者不需要等待对方完成操作,而是可以继续进行自己的工作。
因为RabbitMQ是使Erlang编写的,所以使用RabbitMQ需要安装Erlanghuanjing
1.安装Erlang所需的依赖
yum install -y epel-release
2.添加存储库条目
wget https://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpm
rpm -Uvh erlang-solutions-1.0-1.noarch.rpm
3.安装Erlang
yum install -y erlang
4.查看Erlang是否安装成功
erl -version
1.为了外部能够正常访问RabbitMQ服务,先关闭防火墙
# 关闭运行的防火墙
systemctl stop firewalld.service
# 禁止防火墙自启动
systemctl disable firewalld.service
2.RabbitMQ是通过主机名进行访问的,必须给服务器添加主机名
# 修改文件
vim /etc/sysconfig/network
# 添加如下内容
NETWORKING=yes
HOSTNAME=itbaizhan
# 修改文件
vim /etc/hosts
# 添加如下内容
服务器ip zhangsan
3.在Windos中下载RabbitMQ压缩包(大家去网上找),使用rz命令从Windos上传到Linux(虚拟机)中。
4.安装RabbitMQ
# 解压RabbitMQ
tar xf rabbitmq-server-generic-unix-3.9.13.tar.xz
# 重命名:
mv rabbitmq_server-3.9.13 rabbitmq
# 移动文件夹:
mv rabbitmq /usr/local/
5.配置环境变量
# 编辑/etc/profile文件
vim /etc/profile
#添加如下内容
export PATH=$PATH:/usr/local/rabbitmq/sbin
# 运行文件,让修改内容生效
source /etc/profile
6.开启管控台插件
rabbitmq-plugins enable rabbitmq_management
7.后台运行
# 创建配置文件夹
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远程访问
# 创建配置文件夹
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
1.在虚拟机中安装docker
# 安装Docker
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
# 启动docker
systemctl start docker
2.拉取镜像
docker pull rabbitmq
3.启动RabbitMQ容器
docker run -d --hostname zhangsan --name rabbit -p 15672:15672 -p 5672:5672 rabbitmq
4.开启管控台插件
# 查询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容器
docker stop rabbit
guest账户默认只允许本地使用,我们可以创建新账户远程访问RabbitMQ
1.创建账户
# 创建账户
rabbitmqctl add_user 用户名 密码
2.给用户授予管理员角色
rabbitmqctl set_user_tags 用户名 administrator
3.给用户授权
# "/"表示虚拟机
# itbaizhan表示用户名
# ".*" ".*" ".*" 表示完整权限
rabbitmqctl set_permissions -p "/" itbaizhan ".*" ".*" ".*"
提示:这里对文章进行总结:
RabbitMQ 是一个强大而灵活的消息队列解决方案,能够帮助应用程序实现高性能、可靠的异步通信和数据处理。