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方法,并设置重回队列的参数。

相关推荐
2401_840192271 小时前
ZooKeeper 集群部署指南(Kubernetes StatefulSet 方式)
分布式·zookeeper·kubernetes
Anastasiozzzz1 小时前
RabbitMQ介绍与基础架构
分布式·rabbitmq
【赫兹威客】浩哥1 小时前
【赫兹威客】完全分布式HBase测试教程
数据库·分布式·hbase
Wpa.wk1 小时前
Docker原理和使用场景(网络模式和分布式UI自动化环境部署)
linux·经验分享·分布式·测试工具·docker·性能监控
洛阳纸贵2 小时前
JAVA高级工程师--RabbitMQ消息可靠性、若依集成升级
java·rabbitmq·java-rabbitmq
jiayong232 小时前
MQ性能优化面试题
java·性能优化·kafka·rabbitmq
2401_840192272 小时前
ZooKeeper 单机部署指南
分布式·zookeeper·云原生
Go高并发架构_王工2 小时前
Kafka监控体系构建:指标收集与可视化方案
分布式·kafka·linq
【赫兹威客】浩哥2 小时前
【赫兹威客】完全分布式Hive(on Spark)测试教程
hive·分布式·spark
王莽v21 天前
序列并行-负载均衡
人工智能·分布式