RabbitMQ MQ的可靠性及消费者的可靠性
1.MQ可靠性:
如何保证消息的可靠性:
(1).通过配置可以让交换机、队列、以及发送的消息都持久化。这样队列中的消息会持久化到磁盘,MQ重起消息依然存在。
(2).3.6.0版本开始,RabbitMQ引入了惰性队列模式,这种模式下,消息会直接存储到磁盘而不是内存中,这样可以减少内存消耗,尤其适用于消息量特别大的场景。在3.12版本之后,惰性队列已经成为RabbitMQ的默认队列类型。
(3).开启持久化和生产者确认时,RabbitMQ只有在消息持久化完成后才会给生产者返回ACK回执。
消息持久化
消息持久化是确保 RabbitMQ 中的消息在服务器重启或崩溃后不会丢失的重要机制。通过持久化消息,可以将消息存储在磁盘上,而不仅仅是内存中。这样,即使 RabbitMQ 服务器发生故障,消息也不会丢失,因为它们可以从磁盘上恢复。
持久化队列:在创建队列时,可以指定队列为持久化的。这意味着队列的元数据和其中的消息都会在 RabbitMQ 服务器重启后恢复。
持久化消息:当发送消息时,可以通过设置消息的
deliveryMode
属性为2
(表示消息是持久化的)来确保消息被持久化到磁盘。确保交换器持久化(可选):虽然交换器的持久化不是必需的,但建议也将其设置为持久化,以确保交换器的配置在服务器重启后能够恢复。
2.消费者可靠性
消费者如何保证消费者一定被消费:
(1). 开启消息确认机制为auto,由spring确认消息处理成功后返回ack,异常时返回nack
(2).开启消费者失败重试机制,并设置MessageRecover,多次重试失败后将消息投递到异常交换机,交由人工处理。
消费者确认机制
消费者确认是一种确保消息被正确处理的协议。当 RabbitMQ 将消息传递给消费者后,消费者需要通过发送一个确认回 RabbitMQ 来告知它已经成功接收并处理了这个消息。这样,RabbitMQ 才会从队列中移除该消息。这个机制对于确保数据的可靠性至关重要。RabbitMQ提供了两种消费者确认模式:
(1).自动确认(Auto Acknowledge)
- 模式描述:消息一旦被消费者接收,RabbitMQ立即认为该消息已被成功处理,并将其从队列中删除,无需等待消费者明确确认。
- 优点:吞吐量高,因为省去了显式确认的过程。
- 缺点:如果消费者在处理消息过程中崩溃,消息会丢失,因为RabbitMQ在消息到达消费者时就已经将其标记为已处理。
(2).手动确认(Manual Acknowledge)
- 模式描述:消费者在处理完消息后,需要显式地向RabbitMQ发送确认(ACK)信号,表明该消息已经被成功处理。只有当收到这个确认后,RabbitMQ才会将消息从队列中删除。
- 优点:确保消息不会因消费者故障而丢失。如果消费者处理消息失败,RabbitMQ可以将该消息重新投递给其他消费者(或同一消费者)。
- 缺点:稍微增加了系统的复杂性和延迟,因为需要等待消费者的明确确认。
消费者失败重试机制
消费者失败重试机制是一种确保消息在处理失败时能够被重新处理的策略。消费者在处理消息时,如果发生异常,可以在本地进行重试。重试的次数和间隔可以通过配置来设定。例如,在Spring AMQP中,可以通过application.yml
文件配置重试机制,如下所示:
如何保证业务幂等性
为每条消息生成唯一的ID,并在消费时检查是否已处理过。在数据库层面使用唯一约束,防止重复插入。