RabbitMQ 如何保证消息不丢失

  1. 开启消息确认机制:

    在发布消息时,可以设置deliveryMode为2(持久化),以确保消息不会因为RabbitMQ的崩溃而丢失。

  2. 使队列持久化:

    通过设置durabletrue,可以确保队列在RabbitMQ重启后依然存在。

  3. 使消费者确认机制:

    启用手动确认模式,并在消费完消息后手动确认。

  4. 以下是使用Java和Spring AMQP的示例代码:

    @Bean
    public Queue myQueue() {
    return QueueBuilder.durable("myQueue").build();
    }

    @Bean
    public DirectExchange myExchange() {
    return new DirectExchange("myExchange");
    }

    @Bean
    public Binding myBinding() {
    return BindingBuilder.bind(myQueue()).to(myExchange()).with("myRoutingKey");
    }

    @Bean
    public SimpleMessageListenerContainer messageListenerContainer(ConnectionFactory connectionFactory, MessageListenerAdapter listenerAdapter) {
    SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
    container.setConnectionFactory(connectionFactory);
    container.setQueueNames("myQueue");
    container.setMessageListener(listenerAdapter);
    container.setAcknowledgeMode(AcknowledgeMode.MANUAL); // 手动确认模式
    return container;
    }

    @Bean
    public MessageListenerAdapter listenerAdapter(MyConsumer myConsumer) {
    return new MessageListenerAdapter(myConsumer, "handleMessage");
    }

    public class MyConsumer {
    public void handleMessage(Message message) {
    // 处理消息
    // ...

    复制代码
         // 确认消息
         channel.basicAck(envelope.getDeliveryTag(), false);
     }

    }

在发送消息时:

复制代码
rabbitTemplate.convertAndSend("myExchange", "myRoutingKey", message, message -> {
    message.getMessageProperties().setDeliveryMode(MessageDeliveryMode.PERSISTENT); // 设置消息持久化
    return message;
});

确保你的消费者在处理完消息后调用basicAck来确认消息,这样即使消费者崩溃,未确认的消息也会被重新传递给另一个消费者。如果你希望在消费者异常时自动重新将消息放回队列,可以在handleMessage方法中捕获异常,并在异常处理逻辑中调用basicNackbasicReject方法,并设置重回队列的参数。

相关推荐
Jackyzhe2 小时前
从零学习Kafka:认证机制
分布式·学习·kafka
java修仙传3 小时前
从手写 Redis 锁到 Redisson:我对分布式锁安全性的理解
java·数据库·redis·分布式
juniperhan6 小时前
Flink 系列第10篇:Flink 分布式缓存详解
分布式·缓存·flink
ldj20208 小时前
从 API 调用到事件驱动:用 RabbitMQ /RocketMQ重构微服务通信架构
架构·rabbitmq
gihigo19988 小时前
分布式发电的配电网有功-无功综合优化 MATLAB 实现
开发语言·分布式·matlab
脑子加油站9 小时前
OpenEuler24.03 分布式配置redis 集群
数据库·redis·分布式·php·nginx代理
想你依然心痛10 小时前
HarmonyOS 5.0工业物联网开发实战:构建分布式智能制造监控与数字孪生预测维护系统
分布式·物联网·harmonyos·数字孪生
zhixingheyi_tian10 小时前
Hadoop 之 native 库
大数据·linux·hadoop·分布式
蓝魔Y10 小时前
Apache—Kafka实践
分布式·kafka·apache
喝汽水的猫^10 小时前
Spring Boot + RabbitMQ 实战:消息可靠投递+防重复消费(可直接落地)
spring boot·rabbitmq·java-rabbitmq