幂等:一个数据或者一个请求,重复了多次,确保对应的数据是不会改变的,不能出错

思路:

  • 如果是redis,就没问题,因为每次都是set(会覆盖),天然幂等性
  • 生产者发送消息的时候会带上一个确据唯一的id,消费者拿到消息之后,先根据这个id去redis里查一下,之前有没有消费过,没后消费过就处理,并且写入这个唯一id到redis中,如果消费过,则不处理
  • 基于数据库做 去重表
    • 利用数据库表单的特性来实现幂等,常用的一个思路是在表上构建唯一性索引,保证某一类数据一旦执行完毕,后续同样的请求不再重复处理了(利用一张日志表来记录已经处理成功的消息ID,如果新到的消息ID,如果新到的消息ID已经在日志表中,那么就不再处理这条消息)
    • 以电商平台为例子,电商平台上的订单 id 就是最适合的 token。当用户下单时,会经历多个环节,比如生成订单,)减库存,减优惠券等等。每一个环节执行时都先检测一下该订单 id 是否已经执行过这一步骤,对未执行的请求,执行操作并缓存结果,而对已经执行过的 id,则直接返回之前的执行结果,不做任何操作。这样可以在最大程度上避免操作的重复执行问题,缓存起来的执行结果也能用于事务的控制等。
    • image-20230729101655318