RabbitMQ 应用问题

在这里插入图片描述

1. 幂等性保障

什么是幂等性

幂等性(Idempotence)是一个数学概念,但在计算机科学和编程领域,特别是分布式系统、数据库操作、HTTP请求处理等场景中,它有着特别重要的意义。在数学上,幂等性指的是一个操作(或函数)多次执行与一次执行的效果相同。换句话说,如果某个操作或函数在给定参数上多次执行,其最终结果与仅执行一次时相同,则称该操作或函数具有幂等性。

在计算机科学中,幂等性主要应用于以下几个方面:

  1. 数据库操作:如SQL中的INSERT INTO … ON DUPLICATE KEY UPDATE语句,或者在执行UPDATE操作时,如果更新条件没有匹配到任何行,则操作不会对数据库产生任何影响,因此可以视为幂等的。对于INSERT操作,如果数据库表的主键或唯一索引不允许重复值,则重复的INSERT操作会失败,这本身不是幂等的,但可以通过特定的数据库特性或应用逻辑来实现幂等性。
  2. HTTP请求:在HTTP协议中,GET、PUT、DELETE等方法被认为是幂等的。GET请求用于读取资源,多次读取不会改变资源状态;PUT请求用于替换资源,多次提交相同的资源表示不会改变资源的最终状态;DELETE请求用于删除资源,多次删除同一个已删除的资源也不会产生额外影响。相比之下,POST请求通常不是幂等的,因为它通常用于创建新的资源,多次提交相同的POST请求可能会导致资源的重复创建。
  3. 分布式系统:在分布式系统中,由于网络延迟、节点故障等因素,相同的操作可能会被重复执行。设计系统时,确保关键操作具有幂等性可以大大简化错误处理和重试逻辑,提高系统的健壮性和可靠性。
  4. 消息队列和消息中间件:在消息队列系统中,确保消息处理的幂等性对于避免数据重复处理至关重要。这通常通过消息的唯一标识符(如UUID)来实现,当消息中间件或消费者接收到重复的消息时,可以基于这个唯一标识符来跳过重复的处理。

MQ 的幂等性

对于 MQ 而言,幂等性是指同一条消息,多次消费,对于系统的影响和一次消费是相同的。

一般消息中间件的消息传输保障分为三个层级:

  1. At most once:最多一次,消息可能会丢失,但绝不会重复传输
  2. At least once:最少一次,消息绝不会丢失,但可能会重复传输
  3. Exactly once:恰好一次,每条消息肯定会被传输一次且仅传输一次

RabbitMQ 支持“最多一次”和“最少一次”,对于“恰好一次”,不止是 RabbitMQ,大部分的消息中间件都无法实现“恰好一次”。要想实现“恰好一次“,就需要牺牲性能来实现。

那么如何选择是使用”最少一次“还是”最多一次“呢?在业务使用中,对于消息可靠性要求比较高的场景,建议使用”最少一次“,以防止消息丢失;而对于消息可靠性要求不高的场景就可以使用”最多一次“,”最多一次“的消息传输很可能会因为网络传输、消费异常等问题而导致丢