当前位置: 首页 > news >正文

宝塔windows建设网站小型企业门户网站制作

宝塔windows建设网站,小型企业门户网站制作,成都企业建站系统,可以做效果图的网站一、 核心概念解析 (Conceptual Deep Dive) 要理解持久化,首先要记住这个黄金法则:消息要真正地持久化,必须同时满足两个条件:消息本身是持久化的,并且它要进入的队列也是持久化的。 我们可以用一个邮政系统的比喻来理…

一、 核心概念解析 (Conceptual Deep Dive)

要理解持久化,首先要记住这个黄金法则:消息要真正地持久化,必须同时满足两个条件:消息本身是持久化的,并且它要进入的队列也是持久化的。

我们可以用一个邮政系统的比喻来理解这三者之间的关系:

  • 交换机 (Exchange):邮政分拣中心,负责根据地址(Routing Key)把信件发往不同的区域邮局。
  • 队列 (Queue):你家楼下的邮箱(或者说区域邮局的储物架),最终存放信件等待你来取。
  • 消息 (Message):你写的信件或包裹。

下面我们来详细拆解这三者持久化的作用。

1. 交换机的持久化

这是保证路由规则在重启后依然有效的设置。

  • 作用是什么:告诉 RabbitMQ Broker:“这个邮政分拣中心的结构和规则(名字、类型等)很重要,请记录在硬盘上,重启后需要恢复它。”
  • 如何设置:在声明交换机时,设置 durable 属性为 true
  • 比喻邮政分拣中心大楼本身是一座永久性建筑,而不是一个临时帐篷。
  • 后果:如果交换机不持久(durable = false),Broker 重启后它就会消失。此时,生产者再向这个不存在的交换机发送消息就会失败,整个消息链路从源头就中断了。

2. 队列的持久化

这是承载持久化消息的容器,是消息能否存活的关键前提

  • 作用是什么:告诉 RabbitMQ Broker:“这个队列很重要,它的定义(名字、属性、绑定关系)需要存到硬盘上。当我重启后,你要恢复这个队列。”
  • 如何设置:在声明队列时,设置 durable 属性为 true
  • 比喻:你家楼下的邮箱是钢筋混凝土浇筑的,并且牢牢地固定在地上
  • 后果:如果队列不持久,Broker 重启后整个队列就人间蒸发了。存放在里面的所有消息,无论消息本身是否设置为持久化,都会随之丢失。

3. 消息的持久化

这是最直接影响消息内容存活的设置。

  • 作用是什么:告诉 RabbitMQ Broker:“这封信很重要,请你收到后不要只放在内存里,务必把它存到硬盘上。”
  • 如何设置:在发送消息时,设置其投递模式(delivery mode)为 2 (persistent)。
  • 比喻:用防水防火的特殊信封来装你的信件。
  • 后果:如果消息本身不持久,即使它被投递到了一个持久化的队列里(一个坚固的混凝土邮箱),Broker 重启后,队列本身虽然还在,但里面的这条“普通信件”也会丢失。

持久化流程图

下图展示了一个全链路持久化的消息流。每个关键环节的数据都被写入磁盘,从而抵抗 Broker 的重启。

![[rabbitmq.excalidraw#^group=RdixBJb2_E2m5sxYTuktj]]

二、 demo实践

项目结构和配置

application.yml 中配置好 RabbitMQ 连接信息即可。持久化的配置主要在 Java 代码中。

声明持久化的 Exchange 和 Queue

修改 config/RabbitMQConfig.java,确保在声明时将 durable 设置为 true

package com.example.ackdemo.config;import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class RabbitMQConfig {public static final String PERSISTENT_EXCHANGE = "persistent.exchange";public static final String PERSISTENT_QUEUE = "persistent.queue";public static final String PERSISTENT_ROUTING_KEY = "persistent.key";@Beanpublic TopicExchange persistentExchange() {// 创建一个持久化的交换机return new TopicExchange(PERSISTENT_EXCHANGE, true, false);}@Beanpublic Queue persistentQueue() {// 创建一个持久化的队列// 在 Spring AMQP 中,默认就是 durable(true)return new Queue(PERSISTENT_QUEUE, true);}@Beanpublic Binding persistentBinding(Queue persistentQueue, TopicExchange persistentExchange) {return BindingBuilder.bind(persistentQueue).to(persistentExchange).with(PERSISTENT_ROUTING_KEY);}
}

发送持久化的消息 (Publisher)

修改 controller/MessageController.java。在 Spring Boot 的 RabbitTemplate 中,默认发送的消息就是持久化的 (delivery_mode = 2)。为了清晰地演示,我们同时展示显式设置的方法。

package com.example.ackdemo.controller;import com.example.ackdemo.config.RabbitMQConfig;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageDeliveryMode;
import org.springframework.amqp.core.MessageProperties;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;import java.nio.charset.StandardCharsets;
import java.util.UUID;@RestController
public class MessageController {@Autowiredprivate RabbitTemplate rabbitTemplate;@GetMapping("/send-persistent")public String sendPersistentMessage() {String messageContent = "persistent_order:" + UUID.randomUUID();// 方法1: Spring RabbitTemplate 默认就是持久化的,直接发送即可// rabbitTemplate.convertAndSend(//     RabbitMQConfig.PERSISTENT_EXCHANGE,//     RabbitMQConfig.PERSISTENT_ROUTING_KEY,//     messageContent// );// 方法2: 显式创建 Message 对象,更清晰地控制持久化MessageProperties messageProperties = new MessageProperties();// 设置投递模式为持久化messageProperties.setDeliveryMode(MessageDeliveryMode.PERSISTENT);Message message = new Message(messageContent.getBytes(StandardCharsets.UTF_8), messageProperties);rabbitTemplate.send(RabbitMQConfig.PERSISTENT_EXCHANGE,RabbitMQConfig.PERSISTENT_ROUTING_KEY,message);return "Persistent message sent: " + messageContent;}
}

运行与验证

我们通过模拟 Broker 崩溃来验证持久化是否生效。

  1. 启动应用
  2. 发送消息:在浏览器中访问 http://localhost:8080/send-persistent
  3. 观察队列:打开 RabbitMQ 管理界面 (http://localhost:15672),进入 Queues 标签页。你会看到 persistent.queue 中有一条 Ready 状态的消息。
  4. 模拟崩溃和重启:在终端执行 docker-compose restart rabbitmq。这个命令会快速重启 RabbitMQ 容器。
  5. 验证恢复:刷新 RabbitMQ 管理界面。
    • 你会发现 persistent.queue 依然存在,并且队列中那条 Ready 状态的消息也还在! 这证明了我们的持久化配置是成功的。
  6. 消费消息:此时可以启动一个消费者(或确保之前的应用仍在运行),它会成功地消费这条“劫后余生”的消息。

三、 注意事项

为了实现真正可靠、不怕重启的消息投递,以下四步缺一不可

组件设置作用如果不做会怎样?
交换机 (Exchange)durable = true告诉Broker将交换机的元数据写入磁盘。Broker重启后,交换机消失,生产者无法再向其发送消息。
队列 (Queue)durable = true告诉Broker将队列的元数据和绑定关系写入磁盘。Broker重启后,队列和其中所有的消息都会消失。
消息 (Message)delivery_mode = 2告诉Broker将消息内容写入磁盘。Broker重启后,即使队列还在,消息也会丢失。
绑定 (Binding)(自动)链接持久化的交换机和队列(同上)

但是,持久化就 100% 安全了吗?

答案是否定的。 这也是一个常见的陷阱。

即使你正确配置了所有持久化选项,在消息到达 Broker 之后,仍然存在一个极其短暂的、微妙的时间窗口,可能导致消息丢失。

  • 写入延迟:为了性能,RabbitMQ 不会为每条消息都执行一次磁盘同步写入(fsync)。它会将消息写入操作系统的页面缓存中,然后由操作系统在稍后的某个时间点批量刷入磁盘。如果 RabbitMQ 在将消息写入页面缓存后、但操作系统尚未将其刷入磁盘之前崩溃,那么这条消息依然会丢失。

  • 如何弥补?

    1. 发布者确认 (Publisher Confirms):这是一种机制,让 Broker 在确认已经将消息安全处理(例如,写入磁盘或复制到集群中的其他节点)后,再回调通知生产者。这解决了消息在从生产者到 Broker 途中的丢失问题,也覆盖了上述的写入延迟问题。
    2. 消费者确认 (Consumer Acknowledgements):确保消息被消费者成功处理后通过ACK的方式进行通知生产者再从队列中删除。
性能考量

持久化操作涉及到磁盘 I/O,其性能远低于纯内存操作。因此,在设计系统时需要权衡:

  • 对于绝对不能丢失的关键业务消息(如订单、支付),必须启用全链路持久化。
  • 对于允许少量丢失的非核心数据(如用户行为日志、监控数据),可以考虑使用非持久化消息以换取更高的吞吐量。

四、 总结 (Conclusion)

消息持久化是 RabbitMQ 可靠性编程的核心。通过将交换机队列消息本身都设置为持久化,我们构建了一个能够抵御 Broker 重启的坚固消息系统。

http://www.dtcms.com/a/417053.html

相关文章:

  • 网站域名备案认证随州网站建设哪家便宜
  • 互联斗士网站建站广州网站制作是什么
  • 那有名网站是php做的宁夏网站设计联系电话
  • 树莓派imager使用记录
  • 网站收录更新保险网站有哪些
  • 兴宁市网站建设国内新闻热点事件
  • 做网站审批号必须要西地那非片功效与作用主要会有哪些
  • 网站制作价格甄选乐云践新南京酒店网站制作
  • 网站授权合同深圳苏州企业网站建设服务公司
  • 河南工程建设 协会网站免费行情网站
  • 哪些网站可以做团购免费关键词挖掘网站
  • 上海好的高端网站建国外做机器的好的网站
  • 简单aspx网站开发宁波的网络公司比较有名的
  • 青岛网站建设方案托管wordpress循环分类
  • wordpress迁站页面设计作品
  • 品牌网站建设设计免费ppt课件模板大全
  • 南昌做网站的公司公司找人做网站
  • 中国建设银行龙卡信用卡网站码迷seo
  • 免费学软件的自学网站做网站的一个月能赚多少钱
  • 宁夏建设厅网站首页软件开发的公司
  • 建立了网站后如何发贴我们网站百度快照显示违规内容
  • 哪里有做网站定制衣服的厂家
  • 暴利产品竞价单页网站弄个直播平台大概要多少钱
  • 网站建设策划框架如何在360网站网页上做笔记
  • 公司网站做优化网站建设费用的会计核算
  • 网站怎么添加百度地图做网站用asp还是php
  • 广州网站建设年底促销网站如何做seo的
  • 微网站绑定域名书店建设网站
  • 廊坊网站制作潍坊公司电话使用织梦系统建设网站教程
  • 软件工程师是做什么的镇海seo关键词优化费用