智慧园区管理系统,嘉兴seo网站建设费用,婚庆类网站模板,新手自建网站做跨境电商如何保证Queue消息能不丢呢#xff1f;
RabbitMQ在接收到消息后#xff0c;默认并不会立即进行持久化#xff0c;而是先把消息暂存在内存中#xff0c;这时候如果MQ挂了#xff0c;那么消息就会丢失。所以需要通过持久化机制来保证消息可以被持久化下来。 队列和交换机的…如何保证Queue消息能不丢呢
RabbitMQ在接收到消息后默认并不会立即进行持久化而是先把消息暂存在内存中这时候如果MQ挂了那么消息就会丢失。所以需要通过持久化机制来保证消息可以被持久化下来。 队列和交换机的持久化
在声明队列的时候可以通过设置durable 参数为true 来创建一个持久化队列持久化队列会在Rabbitmq服务器重启后保留确保队列的元数据不会丢失。
在声明交换器时也可以通过设置durable参数为tue来创建一个持久化交换机持久化交换机会在RabbitMQ服务器重启后保留以确保交换机的元数据不好丢失。
绑定关系通常与队列和交换机相关联。当创建绑定关系时还是可以设置durablue参数为true以创建一个持久化绑定。持久化绑定关系会在服务器重启后保留以确保绑定关系不会丢失。 持久化消息
生产者发送的消息可以通过设置消息的deliveryMode创建持久化消息。持久化消息在发送到持久化队列后将在服务器重启后保留以确保消息不会丢失。
deliveryMode 是一项用于设置消息传递模式的属性用于指定消息的持久性级别。分别是有两个值
1.非持久化 这是默认的传递模式如果消息被设置为非持久化RabbitMQ将尽力将消息传递给消费者但不会将其写入磁盘这意味着如果RabbitMQ服务器在消息传递之前崩溃或重启消息可能会丢失。
2.持久化 如果消息被设置为持久化RabbitMQ会将消息写入磁盘以确保即使在RabbitMQ服务器重启时消息也不会丢失。持久化消息对于重要的消息非常有用以确保它们不会再传递过程中丢失。 通过设置deliveryMode 类实现消息的持久化。但是需要注意将消息设置为持久化会增加磁盘IO开销 消费者确认机制
有了持久化机制后那么怎么保证消息在持久化下来之后一定能被消费者消费呢
这里就涉及到消息的消息确认机制。 在RabbitMQ中消费者处理消息成功后可以向MQ发送ack回执MQ收到ack回执后才会删除该消息这样才能确保消息不会丢失。如果消费者在处理消息中出现了异常那么就会返回nack回执MQ收到回执之后会重新投递一次如果消费者一直都没有返回ACK/NACK的话那么他也会在尝试重新投递。
无法做到100%不丢
虽然我们通过发送者端进行异步回调MQ进行持久化消费者做确认机制但是也没办法保证100%不丢因为MQ的持久化其实是异步的。即使我们开了持久化也有可能在内存暂存成功后异步持久化之前宕机了那么这个消息就会丢失。 如果想要做到100%不丢失就需要引入本地消息表来通过轮询的方式来进行消息重投了。