V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
vanpeisi7
V2EX  ›  程序员

Rabbitmq 中, acknowledge-mode 配置为 auto,消费会丢失数据吗?

  •  
  •   vanpeisi7 · 190 天前 · 679 次点击
    这是一个创建于 190 天前的主题,其中的信息可能已经有所发展或是发生改变。
    使用 rabbitmq 的 consumer 的 autoAck 进行消费,什么场景下会丢失数据。我用 springboot 整合 rabbitmq ,使用 SimpleMessageListenerContainer 进行消费,并没有模拟出来丢失数据的场景。我发现,如果配置了 autoAck,SimpleMessageListenerContainer 在 commitIfNecessary 内使用 channel 进行 ack 了。这自己手动调用 channel 进行 ack 有什么区别吗?
    4 条回复    2023-10-26 14:47:36 +08:00
    wolfie
        1
    wolfie  
       190 天前 via Android
    区别再于,开始消费到手动 ack 有没有 exception 。
    vanpeisi7
        2
    vanpeisi7  
    OP
       190 天前
    @wolfie 我理解的主要区别,就是 manaul 手动 ack ,如果出现异常,可以进行捕获,然后进行 basicNack ,basicNack 时候,requeue 设置为 true ,消息会重回队列。出现异常时,消息一直不断的消费和 requeue 进入队列,这样能保证消息不丢失。如果是 autoAct ,出现异常,没法做特殊处理,然后被 SimpleMessageListenerContainer 自动 ack 掉了。如果使用 autoAck,出现异常也进行捕获,然后对异常做处理(比如循环重试,直到成功),这样是否也能保证不丢失消息。
    UltraXiaoZi
        3
    UltraXiaoZi  
       190 天前
    如果你用的是 spring-rabbitmq ,自动模式不会丢失数据,抛出异常后消息会回退,这个你可以自己试一下就知道了,和手动确认的唯一区别是 spring 封装了一个异常类,如果不想出现异常,就抛出 AmqpRejectAndDontRequeueException ,另外你可以看一下 org.springframework.amqp.core.AcknowledgeMode 的注释

    /**
    * Auto - the container will issue the ack/nack based on whether
    * the listener returns normally, or throws an exception.
    * <p><em>Do not confuse with RabbitMQ {@code autoAck} which is
    * represented by {@link #NONE} here</em>.
    */
    AUTO;

    明确告诉你了,这里面的 AUTO 并不是 rabbitmq 中的 auto ,本质上也是手动,只是被 spring 封装了一层,当然你也可以用手动,但是那样对代码的侵入性太高了,而且这种这种通用处理一般建议是抽离到业务代码之外,便于全局控制和保持一致的处理方式,除非你有非常特别的用需要使用 channel 进行操作
    vanpeisi7
        4
    vanpeisi7  
    OP
       190 天前
    @UltraXiaoZi 原来如此,终于明白了,我原以为 spring-rabbitmq 和 rabbitmq 中的 auto 是一样的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2282 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 08:07 · PVG 16:07 · LAX 01:07 · JFK 04:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.