消息队列之RabbitMQ介绍

系列文章目录

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
消息队列之RabbitMQ介绍


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

文章目录

  • 系列文章目录
  • 前言
  • 一、RabbitMQ介绍
    • 消息队列
    • 消息
    • 队列
    • RabbitMQ
  • 二、使用Rabbit MQ的优势
    • 解耦应用
    • 异步处理
    • 流量削峰
    • 高可靠性
  • 三、使用Rabbit MQ的劣势
  • 四、RabbitMQ的应用场景
    • 秒杀活动
    • 消息分发
    • 数据同步
    • 异步处理
  • 五、RabbitMQ的工作原理
  • 六、RabbitMQ的使用
    • 安装Erlang环境
    • 安装RabbitMQ
    • Dockers安装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所需的依赖

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

安装RabbitMQ

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

Dockers安装RabbitMQ

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/630875.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MyBatisPlus学习笔记三-核心功能

接上篇: MyBatisPlus学习笔记二-CSDN博客 1、核心功能-IService开发基础业务接口 1.1、介绍 1.2、引用依赖 1.3、配置文件 1.4、用例-新增 1.5、用例-删除 1.6、用例-根据id查询 1.7、用例-根据ids查询 2、核心功能-IService开发复杂业务接口 2.1、实例-更新 3、…

Elasticsearch各种文档操作2

本文来记录下Elasticsearch各种文档操作 文章目录 初始化文档数据过滤字段查询文档概述指定想要显示的字段示例 初始化文档数据 在进行各种文档操作之前,我们先进行初始化文档数据的工作 过滤字段查询文档 概述 默认情况下,Elasticsearch 在搜索的结果中…

vite和webpack的区别和作用

前言 Vite 和 Webpack 都是现代化的前端构建工具,它们可以帮助开发者优化前端项目的构建和性能。虽然它们的目标是相似的,但它们在设计和实现方面有许多不同之处。 一、Vite详解和作用 vite 是什么 vite —— 一个由 vue 作者尤雨溪开发的 web 开发工…

CMake+QT+大漠插件的桌面应用开发(QThread)

文章目录 CMakeQT大漠插件的桌面应用开发(QThread)简介环境项目结构配置编译环境代码 CMakeQT大漠插件的桌面应用开发(QThread) 简介 在CMakeQT大漠插件的桌面应用开发中已经给出了QT配合大漠插件开发桌面应用的样例 不过由于主…

系统配置dns主从服务器

一、准备两台主机,区分主从 二、完全区域传送 1、主DNS服务器配置 #安装相关的包 [rootoula1 ~]# yum install bind -y#关闭防火墙 [rootoula1 ~]# systemctl stop firewalld [rootoula1 ~]# setenforce 0#修改配置主文件 [rootoula1 ~]# vim /etc/named.conf opt…

pygame学习(三)——支持多种类型的事件

大家好!我是码银🥰 欢迎关注🥰: CSDN:码银 公众号:码银学编程 实时事件循环 为了保证程序的持续刷新、保持打开的状态,我们会创建一个无限循环,通常使用的是while语句,w…

web架构师编辑器内容-编辑器组件图层面板功能开发-锁定隐藏、键盘事件功能的开发

我们这一部分主要是对最右侧图层面板功能进行剖析,完成对应的功能的开发: 每个图层都对应编辑器上面的元素,有多少个元素就对应多少个图层,主要的功能如下: 锁定功能:点击锁定,在编辑器中没法编辑对应的组…

HashMap学习和线程安全的HashMap

HashMap的底层数据结构? HashMap在JDK1.8里面的Node数组加链表加红黑树,当链表长度大于8且数组长度大于64,链表转化为红黑树。当红黑树节点数小于6,红黑树转化为链表。在JDK1.7中是数组加链表。 为什么要用红黑树? 当…

阿赵UE学习笔记——11、地形系统

阿赵UE学习笔记目录 大家好,我是阿赵。   继续学习虚幻引擎的用法,这次来学习一下虚幻引擎的地形系统的用法。 一、创建地形 在选项模式里面,选择地形: 进入到地形界面之后,需要先创建一个地形: 留意看…

TensorRT部署-Windows环境配置

系列文章目录 文章目录 系列文章目录前言一、安装Visual Studio (2019)二、下载和安装nvidia显卡驱动三、下载CUDA四、下载安装cuDNN五、安装Anaconda六、TensorRT安装七、安装Opencv八、Cmake 配置总结 前言 TensorRT部署-Windows环境配置 一、安装Vis…

nginx+lua配置,一个域名配置https,docker集群使用

没安装kua的先安装lua 没有resty.http模块的,许配置 nginxlua配置,一个域名配置https,docker集群使用,一个域名配置https管理整个集群 lua做转发(方向代理) 1、ad_load.lua文件 ngx.header.content_typ…

C++中的预处理

一.预定义符号 1.__FILE__进行编译的源文件 2.__LINE__文件当前的行号 3.__DATE__文件被编译的日期 4.__TIME文件被编译的时间 5.__STDC__如果编译器遵循ANSIC,其值为1,否则未定义 二.#define 基本语法:#define 名字 内容 eg.define M 1 经#define定义的常量时不经过…

Servlet系列两种创建方式

一、使用web.xml的方式配置(Servlet2.5之前使用) 在早期版本的Java EE中,可以使用XML配置文件来定义Servlet。在web.xml文件中,可以定义Servlet的名称、类名、初始化参数等。然后,在Java代码中实现Servlet接口&#x…

基于NLP的恶意网页识别

基于NLP的恶意网页识别 基于NLP的恶意网页识别引言项目目录回顾优化HTML标签提取结果使用预训练模型Fine-tune数据处理和模型训练模型训练与评估模型导出部署与预测总结 基于NLP的恶意网页识别 引言 欢迎阅读《 基于NLP的恶意网页识别》,在前三篇中,我…

VS+QT编译环境中字符乱码问题详解

字符乱码问题详解 1 编码字符集与字符编码方式2 字符乱码原因3 字符乱码解决方案 在解释字符乱码问题之前,我们需要先理清一些基本概念 1 编码字符集与字符编码方式 编码字符集 编码字符集是所有字符以及对应代码值的集合。编码字符集中的每个字符都对应一个唯一的…

npm换源

检查现在的源地址 npm config get registry 使用淘宝镜像 npm config set registry https://registry.npm.taobao.org 使用官方镜像 npm config set registry https://registry.npmjs.org/

jeecgboot 前端bug or 后端 看图

无法显示文本 只能显示value 很恶心 如果用 varchar 就可以 不知道有没有别的方式 用int 解决 ,可能是我没有发现好的方法

渗透测试之如何部署和使用Supershell

环境: Supershell v2.0.0 Centos 7.6 docker v. 21 问题描述: 如何部署和使用Supershell 解决方案: 1、下载最新release源码,解压后进入项目目录 wget https://github.com/tdragon6/Supershell/releases/latest/download/Supershell.tar.gz如果在线下很慢,用浏览…

Day36 贪心算法 part05 435. 无重叠区间 763. 划分字母区间 56. 合并区间

贪心算法 part05 435. 无重叠区间 763. 划分字母区间 56. 合并区间 435. 无重叠区间 class Solution { private:bool static Compare(const vector<int>& a, const vector<int>& b){return a[0] <b[0];} public:int eraseOverlapIntervals(vector<…

测试驱动开发:基于Jenkins+GoTest+HTML的持续化集成

目录 前言 一、项目框架 1.项目迭代 2.项目时序图 3.项目测试执行 二、项目具体实现 1.创建流水线 2.拉取代码 3.执行测试代码 4.生成测试报告 5.报告内容解读 6.数据统计 7.邮件通知 8.企业微信通知 三、项目遇到的问题 1.go test -args 2.go test生…