RabbitMQ 如何保证消息不丢失

  1. 开启消息确认机制:

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

  2. 使队列持久化:

    通过设置durable为true,可以确保队列在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方法中捕获异常,并在异常处理逻辑中调用basicNack或basicReject方法,并设置重回队列的参数。

相关推荐
此时不提桶,更待何时8 小时前
06-12-A-Kafka存储深水区与源码解析详解
分布式·kafka·linq
此时不提桶,更待何时12 小时前
06-15-A-Kafka生态集成与流处理详解
分布式·kafka
此时不提桶,更待何时16 小时前
06-13-A-Kafka客户端与协议深入详解
分布式·kafka
程序猿乐锅1 天前
从0-1一文详解RabbitMQ
java·分布式·后端·中间件·rabbitmq·ruby
新鲜势力呀1 天前
PHP 消息队列实战:从同步接口阻塞到 RabbitMQ + Redis队列 + 异步任务架构完整优化方案
redis·rabbitmq·php
老陈说编程2 天前
1. 鸿蒙 (HarmonyOS) 2012 至 2026 年的发展历程
分布式·华为·个人开发·harmonyos·鸿蒙·鸿蒙系统·程序员创富
xxwl5852 天前
RabbitMQ 学习笔记
笔记·学习·rabbitmq
ly76894 天前
Redis 分布式锁的边界条件:Redlock 争议、锁续期与客户端崩溃后的互斥失效
数据库·redis·分布式·分布式锁·watchdog·redlock
灯澜忆梦4 天前
【minio】#5 | MinIO 分布式部署 + HTTPS 部署
分布式·网络协议·https·对象存储·minio