RabbitMQ 从入门到实战:详解安装、五种消息模型及持久化

消息服务器RabbitMQ及其五种消息模型 文章目录1 消息队列(MQ)是什么1.1 实现MQ的两种方式——AMQP/JMS1.2 RabbitMQ2 五种消息模型2.1 基本消息模型2.1.1 如何避免消息的丢失2.2 work消息模型2.2.1 说明2.2.2 消息堆积越来越多?——能者多劳2.3 三种订阅模型2.3.1 订阅模型——Fanout2.3.2 订阅模型-Direct2.3.4 订阅模型-Topic2.4 如何避免消息丢失?... 阅读详情

一、RabbitMQ 核心介绍

1. 什么是 MQ?

MQ (Message Queue,消息队列)​ 是一种消息中间件,主要用于在微服务或分布式系统之间进行异步通信。

  • 核心作用:通过“发送者 -> 队列 -> 消费者”的模式,实现服务间的解耦。

2. 什么是 AMQP?

AMQP (Advanced Message Queuing Protocol)​ 即高级消息队列协议。RabbitMQ 是基于此协议实现的。

在 RabbitMQ 中,主要包含以下几个核心概念:

  • Connection(连接):类似于一条高速公路(如京港澳高速)。

  • Channel(信道):建立在 Connection 之上的虚拟连接,类似于公路上的车道。大部分 API 操作都在 Channel 中进行,它是复用的,减少了建立 TCP 连接的开销。

  • Queue(队列):存储消息的容器,消息最终在这里等待被消费。

  • Exchange(交换机):负责接收生产者发送的消息,并根据路由规则将消息分发到一个或多个队列中。

3. 什么是 RabbitMQ?

RabbitMQ 是使用 Erlang 语言编写的一款开源消息代理软件,它实现了 AMQP 协议,具有高性能、高可用性和易用性等特点。

4. 为什么要使用 MQ?

引入 MQ 主要为了解决以下问题:

  • 解耦:服务 A 原本需要调用 B 和 C。如果新增 D 服务,只需让 D 监听队列即可,无需修改 A 的代码。

  • 异步:服务 A 将消息发送到 MQ 后即可返回,B 和 C 服务异步消费消息进行处理,提升了响应速度。

  • 削峰:在高并发场景下,请求先进入 MQ,后端服务根据自己的处理能力慢慢拉取消息,防止系统被瞬时流量冲垮。

5. Spring Boot 整合

在 Spring Boot 项目中,通常使用起步依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

二、RabbitMQ 安装与配置 (Linux/CentOS)

1. 安装 Erlang 环境

RabbitMQ 依赖 Erlang,需先安装:

cd /usr/upload
rpm -ivh esl-erlang-17.3-1.x86_64.rpm --force --nodeps
rpm -ivh esl-erlang_17.3-1~centos~6_amd64.rpm --force --nodeps
rpm -ivh esl-erlang-compat-R14B-1.el6.noarch.rpm --force --nodeps

2. 安装 RabbitMQ Server

rpm -ivh rabbitmq-server-3.4.1-1.noarch.rpm

3. 服务管理

# 启动服务
service rabbitmq-server start
# 查看状态
service rabbitmq-server status
# 设置开机自启
chkconfig rabbitmq-server on
# 停止服务
service rabbitmq-server stop
# 重启服务
service rabbitmq-server restart

4. 启用后台管理界面

RabbitMQ 提供了一个 Web 管理界面,非常方便:

rabbitmq-plugins enable rabbitmq_management
service rabbitmq-server restart

5. 用户管理

默认的 guest用户通常只允许本地访问,建议创建新管理员:

# 创建用户 admin,密码 1111
rabbitmqctl add_user admin 1111
# 设置用户角色为管理员
rabbitmqctl set_user_tags admin administrator
# 设置权限 (允许访问默认vhost "/",并赋予所有权限)
rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"
# 查看用户列表
rabbitmqctl list_users

6. 访问测试

浏览器访问:http://<你的服务器IP>:15672

使用刚创建的 admin/1111登录。


三、五种核心消息模型

1. Simple 简单模型

结构:Producer -> Queue -> Consumer

这是最简单的模型,一对一发送。

关键问题:如何保证消息被成功消费?

  • 答案:使用 手动 ACK (Acknowledge)。

  • 默认是自动ACK,即消息一旦被消费端收到就认为成功。如果消费过程中报错,消息就丢了。

  • 手动ACK代码示例:

    // 第二个参数 autoAck 设为 false
    channel.basicConsume(queueName, false, new DefaultConsumer(channel) {
        @Override
        public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
            try {
                // 业务逻辑处理
                System.out.println("Received: " + new String(body));
                // 手动确认:参数1是消息标签,参数2是是否批量确认
                channel.basicAck(envelope.getDeliveryTag(), false);
            } catch (Exception e) {
                // 异常处理,可以选择拒绝或重回队列
            }
        }
    });

2. Work 工作模型

结构:Producer -> Queue -> 多个 Consumer

多个消费者竞争消费同一个队列中的消息。

关键问题:如何防止消息堆积?

  • 答案:采用 能者多劳 (Prefetch Count)​ 策略。

  • 默认情况下,RabbitMQ 会按顺序将消息平均分给消费者(轮询)。如果某个消费者处理慢,会导致堆积。

  • 解决方案:设置 channel.basicQos(1)。意思是:在我没有确认当前消息处理完之前,不要再给我发新的消息。这样处理快的人就会多干点活。

3. Fanout 广播模型

结构:Producer -> Exchange -> (绑定) -> 多个 Queue -> 多个 Consumer

  • 特点:不处理路由键,只需要将队列绑定到交换机上。发送到交换机的消息会被转发到所有与该交换机绑定的队列上。

  • 注意:如果 Exchange 没有绑定任何 Queue,消息会被直接丢弃。

4. Direct 定向模型

结构:Producer -> Exchange (RoutingKey) -> Queue -> Consumer

  • 特点:通过 Routing Key (路由键)​ 来控制消息的分发。

  • 队列在绑定交换机时,需要指定一个 Binding Key。只有当消息的 Routing Key 与 Binding Key 完全匹配时,消息才会被路由到该队列。

5. Topic 通配符模型

结构:Producer -> Exchange (Pattern) -> Queue -> Consumer

  • 特点:Topic 是 Direct 的扩展,支持通配符匹配。

  • 通配符规则:

    • *:匹配一个单词(用 .分隔)。

    • #:匹配零个或多个单词。

  • 示例:

    • Routing Key 为 user.news可以匹配 *.news或 user.#。


四、持久化机制(数据安全)

为了保证 RabbitMQ 重启后消息不丢失,我们需要做三层持久化:

1. Exchange 持久化

在声明交换机时,将 durable参数设置为 true。

// 第三个参数为 durable (是否持久化)
channel.exchangeDeclare(EXCHANGE_NAME, "direct", true);

2. Queue 持久化

在声明队列时,同样设置持久化。

// 第二个参数为 durable
channel.queueDeclare(QUEUE_NAME, true, false, false, null);

3. 消息持久化

在发送消息时,设置消息属性为持久化。

// 使用 MessageProperties.PERSISTENT_TEXT_PLAIN 表示持久化
channel.basicPublish(EXCHANGE_NAME, ROUTING_KEY, MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes());

总结:保证消息不丢的终极方案 = 手动ACK(应对消费失败)​ + 持久化(应对MQ宕机)。


💡 发布建议

这篇文章结构已经很清晰了。如果你打算发布,建议在开头加一段“前言”,简单说说你为什么学 RabbitMQ,或者在结尾加个“总结”,这样更容易获得读者的收藏和点赞哦!

商城-RabbitMQ及消息同步-五种消息模型 商城-RabbitMQ及消息同步-五种消息模型2.五种消息模型2.1.基本消息模型2.1.1.生产者发送消息2.1.2.管理工具中查看消息2.1.3.消费者获取消息2.1.4.消息确认机制(ACK)2.1.4.1.自动ACK存在的问题2.1.4.2.演示手动ACK2.2.work消息模型2.2.1.生产者2.2.2.消费者12.2.3.消费者22.2.4.能者多劳2.3.订阅模型分类2.4.订阅模... 阅读详情

相关推荐

【RabbitMQ 实战】10 消息持久化和存储原理

交换器、队列、消息都可以设置是否持久化。交换器和队列持久化的含义是元数据持久化。消息持久化的含义是消息本身持久化。将交换器、队列、消息都设置了持久化之后能百分之百保证数据不丢失吗?答案是不能从消费者来说,如果在订阅消费队列时将 autoAck 参数设置为 true,那么当消费者接收到相关消息之后,还没来得及处理就宕机了,这样也算数据丢失。这种情况很好解决,将autoAck 参数设置为 false,并进行手动确认。

程序员笔记 7812

【RabbitMQ】常用消息模型详解

本文涉及AMQP协议的回顾、RabbitMQ支持的消息模型概述、以及其中Direct模型、WorkQueue模型、Fanout模型、Routing模型、Topic模型的详细介绍与使用

十八岁讨厌编程的博客 3643

RabbitMQ消息持久化

当RabbitMQ服务器挂了,它可能就丢失所有队列中的消息和任务。如果你想让RabbitMQ记住当前的状态和内容,就需要通过2件事来确保消息和任务不会丢失:同时将queue和messages标识为durable。 设置了队列和消息的持久化之后,当broker服务重启的之后,消息依旧存在。单只设置队列持久化,重启之后消息会丢失;单只设置消息的持久化,重启之后队列消失,既而消息也丢失。单单设置消息持久化而不设置队列的持久化显得毫无意义。 注意:已经定义的队列,再次定义是...

吭哧吭哧快乐的小牛码 2万+

RabbitMQ之五种消息模型

虚拟主机:类似于mysql中的database。他们都是以“/”开头。

qq_57907966的博客 2412

FPGA—ZYNQ_BD Block Design学习(一)

1.第一步:打开Vivado软件,创建或打开一个工程。2.第二步:在Block Design中添加arm核心,并将其配置为IP核。3.第三步:配置arm核心的外设信息,如DDR接口、时钟频率、UART接口等。4.第四步:完成Block Design中的模块互联,生成PL端的比特流。 5.第五步:导出PS端的硬件信息,包括arm IP核的外设、速度、引脚和地址等信息。1创建bd 需要有ddr以及uart和时钟配置外设io口,这里就是zynq的管脚规定好的,根据原理图用哪个个勾选哪一个。 对外设uart的配

m0_58129662的博客 1027

教程 | VeriStand硬件在环仿真测试第一章

这篇是系列文章的第一章,满满的都是干货,感兴趣的话欢迎一起交流探讨。

HUASUITECH的博客 1万+

消息队列之RabbitMQ的五种消息模型,及如何保证可靠消息最终一致性

消息队列(Message Queue,简称MQ):是在消息的传输过程中保存消息的容器,用于分布式系统之间进行通信。MQ的选型和对比在讲RabbitMQ之前先说一下AMQP,即 Advanced Message Queuing Protocol(高级消息队列协议),是一个网络协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。2006年,AMQP规范发布。类比HTTP。

Tobenumerator的博客 1万+

速腾RS-LiDAR-16激光雷达ROS配置全攻略:从硬件连接到Rviz点云可视化

本文详细介绍了速腾RS-LiDAR-16激光雷达在ROS环境中的配置与使用全攻略,涵盖硬件连接、网络配置、ROS驱动安装及Rviz点云可视化等关键步骤。通过实战案例和技术解析,帮助开发者快速实现激光雷达数据采集与处理,提升机器人感知系统的部署效率。

ooo22的博客 248

RabbitMQ的五种常见消费模型

在RabbitMQ中,消息的生产和消费是通过一系列的消费模型来管理的。本文将深入介绍RabbitMQ的五种常见消费模型,包括简单队列模型、工作队列模型、发布/订阅模型、路由模型和主题模型,在这种模型中,交换机会将消息路由到与它所绑定的队列匹配的路由键的队列中。如果有消息时,所有的消费者都会在接收到该消息后进行同样的处理,无法根据具体情况进行消息的划分,而且消息被平均分配,不能根据消息的重要性和紧急性进行处理。需要根据消息内容的模式将消息路由到不同队列的应用程序,例如按标签或关键字分发和处理不同的任务。

唯有努力,方可自信! 1万+

设计师必看!用Figma MCP自动生成开发文档的隐藏技巧

本文为设计师揭秘利用Figma MCP协议自动生成开发文档的隐藏技巧。通过将设计稿转化为结构化数据,实现设计规范的自动化输出、版本同步与动态更新,并借助AI助手提升协作效率,彻底告别繁琐的手动标注与沟通。

berry的博客 923

分享一个简单的迭代学习机器人双臂控制(MATLAB)

1 什么是迭代学习控制 迭代学习控制(iterative learning control,简称ILC)由Uchiyama于1978年首先提出,不过因为论文由日文撰写,影响不是很大。1984年,Arimoto等人用英文介绍了该方法。它是指不断重复一个同样轨迹的控制尝试,并以此修正控制律,以得到非常好的控制效果的控制方法。 迭代学习控制的特点是“在重复中学习”,通过反复的迭代修正,达到改善控制效果的目的。迭代学习控制的原理是根据系统前次运行所获得的输出误差信息,在控制过程中不断修正控制输入,随着迭代的进行,逐

weixin_45776027的博客 4483

【SpringBoot学习】12、RabbitMQ 五种消息模型概念

AMQP和JMS MQ是消息通信的模型,并发具体实现。现在实现MQ的有两种主流方式:AMQP、JMS。 AMQP,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。Erlang中...

Tellsea 2521

R语言 地理加权随机森林(GWRFC )

随机森林可以产生高准确度的分类器,被广泛用于解决模式识别问题。然而,随机森林赋予每个决策树相同的权重,这在一定程度上降低了整个分类器的性能。该算法引入二次训练过程,提高分类正确率高目前,鲜有中文文章介绍GWRFC的技术文档,作者想使用该方法时会遇到重重困难,因此有必要利用R来建模,通过流程演示,供读者参阅。............

qingchen98的博客 6626

RabbitMQ的五种常用消息模型

目录 五种消息模型 基本消息模型 work消息模型 订阅模型-Fanout(广播) 订阅模型-Direct(路由) 订阅模型-Topic(通配符) 持久化 五种消息模型 RabbitMQ提供了6种消息模型,但是第6种其实是RPC,并不是MQ。其中3、4、5这三种都属于订阅模型,只不过进行路由的方式不同。 基本消息模型 原理 P...

我能在河边钓一整天的鱼 3986

Nerf 训练自有数据

colmap相机位姿转为LLFF格式数据

zfjBIT的专栏 2309

用python画带有正负值的条形图

常见的条形图只能表现数据的大小,却不能表现值的正负关系。但是其实仅仅使用`pandas`和`matplotlib`两个包就可以实现y轴负轴的添加以及负值的显示,并且可以为正负值分别设置不同的颜色,让条形图看上去更加清晰,易于我们分析

weixin_44853840的博客 5382

【rabbitMQ】五种消息模型

高效能人士的七个习惯 这本书不是一本普通的成功学之作,而是一本能够付诸实践的处世方法论,它让我们可以静下心来反思自己的态度。 一. 积极主动:个人愿景的原则 积极主动的人在生活中更多讲“我可以……”、“我愿意……”、“我能够……”,而不是“但愿……”、“如果……就好了”,也就是把精力放在能够控制的事情上,主动创造有利于自己发展的环境,而不是怨天尤人,处处找借口。 二. 以终为始:自我领...

丢失了名字的琥珀川 3317

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

SpringBoot整合RabbitMQ 实现五种消息模型 详细教程

今天说下了消息队列中间件,各种队列性能对比,RabbitMQ队列,交换机(Exchange)以及消息 中间件的应用场景,然后带着大家一起实现RabbitMQ的五种消息模型。 消息队列中间件 消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题实现高性能,高可用,可伸缩和终一致性[架构] 使用较多的消息队列有 ActiveMQ,RabbitMQ,ZeroMQ,K...

小宋的博客 8914

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

RabbitMQ消息模型详解

RabbitMQ消息模型详解,原理详解,代码展示。其中包括简单消息模型,工作模型,订阅发布模型,订阅模型-Fanout,订阅模型-Direct。

小小张自由—>张有博 1万+

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

RabbitMQ 消息持久化:如何实现消息不丢失?三重持久化完整实战

在 RabbitMQ 生产环境中,服务器重启、宕机、断电是无法避免的问题,如果没有配置持久化,MQ 重启后所有队列和消息会全部丢失,导致业务数据异常、订单丢失、日志缺失等严重问题。消息持久化是 RabbitMQ 保证消息可靠性的核心手段。本文将从持久化原理、三大持久化环节、流程图、代码实战、生产配置全方位讲解,让你彻底掌握 RabbitMQ 持久化方案。将内存中的队列、交换机、消息写入磁盘,当 RabbitMQ 服务器重启、崩溃恢复后,数据不会丢失,自动从磁盘加载恢复。RabbitMQ 持久化分为。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 1902

rabbitmq五种消息模型和消息持久化

当你运行许多消费者时,任务将在他们之间共享,但是一个消息只能被一个消费者获取。Topic类型的Exchange与Direct相比,都是可以根据RoutingKey把消息路由到不同的队列。在Direct模型下,队列与交换机的绑定,不能是任意绑定了,而是要指定一个RoutingKey(路由key)在某些场景下,我们希望不同的消息被不同的队列消费。消息的发送方在向Exchange发送消息时,也必须指定消息的routing key。​ 5、生产者发送的消息,经过交换机到达队列,实现一个消息被多个消费者获取的目的。

孟斌斌的博客 1281

rabbitMQ五种消息模型

rabbitMQ提供了6种消息模型,但是第六种其实是RPC(远程过程调用),并不是MQ,所以是5种模式。 其中5种消息模型分为两类: 第一种和第二种是点对点 第三,四,五种是一对多,都属于订阅模型,只不过是进行路由的方式不同。 第六种RPC远程调用也可不算做模式 本文参照网站:https://www.rabbitmq.com/getstarted.html 一,一对一简单模式 概念 生产者将消息发送到“ hello”队列。使用者从该队列接收消息。 图解 “ P”是我们的生产者 “

weixin_45099622的博客 4632

RabbitMQ(六)消息的持久化

RabbitMQ(六)消息的持久化

ACGkaka的博客 4042

RabbitMQ_01_RabbitMQ五种消息传输模型

文章目录一、前言二、RabbitMQ 五种消息模型2.1 基本消息模型2.1.1 生产者发送消息2.1.2 管理工具中查看消息2.1.3 消费者获取消息2.1.4 消息确认机制2.1.4.1 自动ACK存在的问题2.1.4.2 手动ACK2.2 工作者消息模型2.2.1 生产者2.2.2 消费者1处理任务比较慢2.2.3 消费者2处理任务比较快2.2.4 工作者模式存在的问题2.3 RabbitMQ三种订阅模式2.4 广播模式2.4.1.生产者2.4.2 消费者12.4.3 消费者22.4.4 测试2.5

毛毛的专栏 2013

RabbitMQ支持的消息模型

目录 1.什么是MQ 1.2 MQ有哪些 1.3不同MQ特点 2 RabbitMQ AMQP协议 1 RabbitMQ支持的消息模型 4.2引入依赖 4.3第一种模型(直连) 1.开发生产者 2.开发消费者 4.4RabbitMQ中连接工具类封装 4.5细节 4.6第二种模型(work quene) 1.定义: 2.角色: 3.生产者: 4.消费者 创建2个: // 区别是是否带下面这个线程休眠代码 5.总结: 6.缺点: 5.第三种模型(fanout| 广播) 1

Ciel_Y的博客 2756

【Rabbitmq的消息模型】

如上模型,如果是循环的分发方式,Consumer-1一次性被分到的消息为1,3,5号消息,Consumer-2一次性被分到的消息为2,4,6号消息。如果开启消息自动确认,那么一旦MQ把消息发送给消费者,那么该消息就会立即标记为删除。例如,有编号1-10的消息在MQ中,同时存在两个消费者,则消费者A分到的消息为1,3,5,7,9,消费者B分到的消息为2,4,6,8,10。的分发消息的方式,消费能力强的消费者就会被分到更多的消息,消费能力弱的消费者就会被分到更少的消息,该方式需要作额外设置。

m0_50116974的博客 1798
上一篇: RabbitMQ 入门详解(含安装 + 配置 + 管理后台)
StackNoOverflow
博客等级 码龄1年 22粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值