网站首页 > 技术文章 正文
RabbitMQ 支持消息的持久化,以确保在 RabbitMQ 重启或发生故障时,消息不会丢失。要实现消息持久化,需要做两件事情:
- 将队列标记为持久化:这需要在声明队列时指定 durable 参数为 true。
- 将消息标记为持久化:这需要在发送消息时,将消息的 DeliveryMode 设置为 2(持久化)。
存储模式
RabbitMQ 使用一种称为 mirror queue 的机制来实现队列的高可用性。这种机制允许队列的内容在多个节点之间进行镜像,从而在节点发生故障时,其他节点可以接管工作,确保服务的连续性。
代码示例
以下是使用 Spring Boot 和 RabbitMQ 实现消息持久化的示例代码:
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer;
import org.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RabbitConfig {
@Bean
public Queue myDurableQueue() {
return new Queue("myDurableQueue", true); // 队列持久化
}
@Bean
public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
RabbitTemplate template = new RabbitTemplate(connectionFactory);
template.setChannelTransacted(true); // 开启事务
return template;
}
@Bean
public SimpleMessageListenerContainer container(ConnectionFactory connectionFactory) {
SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
container.setQueueNames("myDurableQueue");
container.setMessageListener(new MessageListenerAdapter(new RabbitListener()));
return container;
}
}
public class RabbitListener {
public void handleMessage(String message) {
System.out.println("Received message: " + message);
}
}
在发送消息时,确保消息是持久化的:
rabbitTemplate.convertAndSend("myDurableQueue", message, message1 -> {
message1.getMessageProperties().setDeliveryMode(MessageDeliveryMode.PERSISTENT);
return message1;
});
通过以上设置,可以确保在 RabbitMQ 中消息即使在发生故障的情况下也不会丢失。不过,需要注意的是,消息持久化会带来性能上的开销,因此在使用时需要根据实际需求进行权衡。
猜你喜欢
- 2024-10-02 「2021最新版」RabbitMQ面试题总结,每道题都很经典
- 2024-10-02 RabbitMQ如何保证消息不丢失 运城丢失女孩最新消息
- 2024-10-02 用 RabbitMQ 延迟队列,实现消息延迟推送
- 2024-10-02 RabbitMQ如何保证消息不丢失? 山西丢失孩子最新消息
- 2024-10-02 超详细的RabbitMQ入门,看这篇就够了
- 2024-10-02 3分钟阅读技术干货,一步一步的理解RabbitMQ
- 2024-10-02 周日福利--消息队列学习必备宝典(RabbitMQ实战指南)
- 2024-10-02 RabbitMQ 如何实现数据100%不丢失
- 2024-10-02 C# 消息队列之RabbitMQ rabbitmq消息队列类型
- 2024-10-02 RabbitMQ 持久化和权重分配消息 rabbitmq的持久化和确认机制
你 发表评论:
欢迎- 02-26Docker目录说明之 /var/lib/docker
- 02-26家用nas最常用的docker容器及部署方法
- 02-26Docker快速上手笔记
- 02-26怎样在Python中操作Docker容器?
- 02-26手把手教你搭建LLM模型知识库,开启AI智慧大门
- 02-26Docker容器是个啥?和VM有什么区别?
- 02-26Docker入门指南:从新手到容器大师
- 02-26带你一文搞懂 Docker
- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)