RabbitMq入门(消息持久化autoDelete、消息确认ACK机制)

    xiaoxiao2022-12-07  41

    目录

    消息持久化处理

        autoDelete属性

    消息确认ACK机制

        解决方式


    消息持久化处理

    消息的可靠性是RabbitMQ的一大特色,那么RabbitMQ是如何保证消息可靠性的呢——消息持久化。

        autoDelete属性

    @Queue: 当所有消费客户端连接断开后,是否自动删除队列 true:删除false:不删除

    @Exchange:当所有绑定队列都不在使用时,是否自动删除交换器 true:删除false:不删除

    当Queue中的 autoDelete 属性被设置为true时,那么,当消息接收着宕机,关闭后,消息队列则会删除,消息发送者一直发送消息,当消息接收者重新启动恢复正常后,会接收最新的消息,而宕机期间的消息则会丢失

    当Quere中的 autoDelete 属性被设置为false时,那么,当消息接收者宕机,关闭后,消息队列不会删除,消息发送者一直发送消息,当消息接收者重新启动恢复正常后,会接收包括宕机期间的消息。

    autoDelete设置是否为临时的,临时的当消息接收者关闭时,队列、交换器则会被删除。为true时,则不会被删除。

    消息确认ACK机制

    消息确认机制,就是说,确认消息正常执行了。当消息正常执行后,会返回一个ACK。没有正常执行则不会返回ACK

    消息发送者向消息队列中发送一条消息,然后在消息接收者那里 手动的抛出一个异常 ,启动服务,由于消息接受者那里一直没有ACK反馈,那么消息就会一直返回到消息队列中,直到消息被正常执行消费。

    RabbitMq控制台就会显示一条消息未被消费。

    当发送很多消息的时候,第一条无法正常执行消费,那么,后面的所有消息都无法执行,会一直存在消息队列中,这样就会导致内存问题。这是一个很严重的问题

        解决方式

    第一种方式:

        可以对这个异常进行处理,最简单的就是try catch一下。

    第二种方式

        可以在配置yml文件中配置一个尝试次数,尝试几次失败后就不再尝试了,将消息删除。

    #开启重试 spring: rabbitmq: listener: retry: enabled: true #重试次数,默认为3次 spring: rabbitmq: listener: retry: max-attempts: 5

     

    最新回复(0)