消息重试

失败重试可以解决短暂性的消费失败的情况。在生产过程中,会有异常出现,比如执行逻辑出现异常,没有消费成功,这个时候就需要mq重新进行消息消费,默认重试3次。

yml 配置文件

spring:
  # Rabbitmq 配置:RabbitProperties
  rabbitmq:
    # RabbitMQ主机地址。如果设置了address属性,则忽略。
    host: 192.168.31.100
    # RabbitMQ端口。如果设置了address属性,则忽略。默认为 5672,如果启用了SSL,则默认为5671。
    port: 5672
    # 访问broker进行身份验证的账号。默认为“guest”。
    username: admin
    # 访问broker进行身份验证的密码。默认为“guest”。
    password: admin
    # 连接到broker时要使用的虚拟主机。
    virtual-host: /
    # 消息发布确认方式,有三个可选值:SIMPLE、CORRELATED、NONE。默认为NONE。
    publisher-confirm-type: simple
    # 启动消息失败返回,只有设置为true时,消息路由失败才会触发Return回调
    publisher-returns: true
    # RabbitProperties.Template
    template:
      # 当exchange无法找到任何一个合适的queue时,将消息return给生产者
      mandatory: true
    # RabbitProperties.Listener
    listener:
      simple:
        #NONE:自动确认;AUTO:根据情况确认;MANUAL:手动确认
        acknowledge-mode: manual
      direct:
        #NONE:自动确认;AUTO:根据情况确认;MANUAL:手动确认
        acknowledge-mode: manual
  cloud:
    stream:
      #instanceCount: 2  #消费者总数
      #instanceIndex: 0  #当前消费者的索引
      # 消息中间件绑定配置:BindingProperties
      bindings:
        sms-input:
          # 指定要使用的 Exchange 名称
          destination: ramq.sms.topic
          #设置消息类型
          content-type: application/json
          #设置消息的组名称(同名组中的多个消费者,只会有一个去消费消息.)
          group: group1
          # 消费者配置:ConsumerProperties
          consumer:
            #开启分区支持
            partitioned: true
            #NONE:自动确认;AUTO:根据情况确认;MANUAL:手动确认
            acknowledge-mode: manual
            #当消息消费失败时,尝试消费该消息的最大次数(消息消费失败后,发布者会重新投递)。默认3
            max-attempts: 2
            # 消息消费失败后重试消费消息的初始化间隔时间。默认1s,即第1次重试消费会在1s后进行
            back-off-initial-interval: 1000
            # 相邻两次重试之间的间隔时间的倍数。默认2,即第2次是第1次间隔时间的2倍,第3次是第2次的2倍
            back-off-multiplier: 2.0
            # 下一次尝试重试的最大时间间隔,默认为10000ms,即10s。
            back-off-max-interval: 10000
      # 消息中间件配置:BinderProperties
      binders:
        defaultRabbit:
          type: rabbit
      # Rabbit 消息中间件专属配置:RabbitExtendedBindingProperties
      rabbit:
        # Rabbit消息中间件绑定配置:RabbitBindingProperties
        bindings:
          sms-input:
            # 消费者配置:RabbitConsumerProperties
            consumer:
              #NONE:自动确认;AUTO:根据情况确认;MANUAL:手动确认
              acknowledge-mode: manual

事实上,消息确实被丢弃了,但是这样不是可靠的实现,会存在丢失部分消息的隐患,于是不得不引入另一个概念——死信队列

作者:Jeebiz  创建时间:2023-04-04 12:06
最后编辑:Jeebiz  更新时间:2024-11-01 10:06