可靠性

生产者重连

spring:
  rabbitmq:
    addresses: localhost:5672  # RabbitMQ服务地址
    virtual-host: /            # RabbitMQ虚拟主机
    username: admin            # RabbitMQ用户名
    password: sdr@sdr_rabbitmq # RabbitMQ密码
    listener:
      simple:
        prefetch: 1 # 每次只接收一条消息,处理完后再接收下一条消息
    template:
      retry:
        enabled: true
        initial-interval: 1000  # 重试间隔时间
        max-attempts: 3         # 最大重试次数
        multiplier: 1           # 重试时间间隔倍数,即第一次重试间隔为1000ms,第二次为2000ms,第三次为3000ms

生产者确认

RabbitMQ有两种确认机制:Publisher Confirm和Publisher Return。开启确认机制后,在MQ成功收到消息后会返回确认消息给生产者,返回结果有以下几种情况。

  • 消息投递到MQ,但是路由失败,此时会通过PublisherReturn返回路由异常原因,然后返回ACK,告知投递成。

  • 临时消息投递到MQ,并且入队成功,返回ACK,告知投递成功。

  • 持久化消息投递到MQ,并且入队完成持久化,返回ACK,告知投递成功。

  • 其它情况都会返回NACK,告知投递失败。

spring:
  rabbitmq:
    addresses: localhost:5672  # RabbitMQ服务地址
    virtual-host: /            # RabbitMQ虚拟主机
    username: admin            # RabbitMQ用户名
    password: sdr@sdr_rabbitmq # RabbitMQ密码
    listener:
      simple:
        prefetch: 1 # 每次只接收一条消息,处理完后再接收下一条消息
    template:
      retry:
        enabled: true
        initial-interval: 1000  # 重试间隔时间
        max-attempts: 3         # 最大重试次数
        multiplier: 1           # 重试时间间隔倍数,即第一次重试间隔为1000ms,第二次为2000ms,第三次为3000ms
    publisher-confirm-type: correlated  # 开启发送确认
    publisher-returns: true     # 开启消息发送失败返回队列
// 2. 给Future对象设置回调函数
rabbitTemplate.setConfirmCallback((correlationData, ack, cause) -> {
    if (ack) {
        System.out.println("消息发送成功");
    } else {
        System.out.println("消息发送失败");
    }
});
// 3. 发送消息
rabbitTemplate.convertAndSend("work.exchange", "work.routing.key", "hello world", correlationData);

数据持久化

RabbitMQ 实现数据持久化包括三个方面:

  • 交换机持久化

  • 队列持久化

  • 消息持久化

最后更新于

这有帮助吗?