00:03
那么一旦啊,消息我们说,呃,出现了这种。出现了这个重复消费是吧,那怎么办呢?我们就要解决它啊,也就是我们刚才说到的是吧,这个密等处理怎么样处理,要设计相应的解决方案。呃,老人在这啊,先咱咱咱们。不先把这个说这个Q里边怎么解决的啊,我们先来说一下关于这个密等啊,因为在很多地方都需要做这种密等处理的,所以我们先说一个通用的解决方案。嗯。那么密等解决方案里边,它的设计中啊,涉及到两个重要的。两个重要的要素。啊,就就这一个,一个叫密等令牌,一个叫呃,这个这个这个唯一性处理。这两个啊。我们只要充分的利用好这两个要素,就可以设计设计出啊非常良好的这种密的解决方案,所以我们先看一下啊,这两个这两个要素是什么。
01:10
呃,密度令牌是什么呢?是生产者和消费者两者中的既定协议,那他们的他们俩商量好的一个协议。那这个协议是指什么呢?通常啊,指的是,呃,具备唯一业务标识的字符串。呃,比如说吧,说再具体一些啊,比如说。啊,例如啊,我们的比如说这个。订单是吧。啊,订单号。订单号啊,还有我们就是这种流水号,一般我们大家知道有流水号啊,他一般不会重吧,啊等等吧。呃,就是。一一般这个东西啊,呃是由谁呢?一般这个东西呃由我们生产者。
02:06
由生产者啊,就是就是。发送消息的时候呢,就直接就传递过来的。啊,一般由。是吧?呃,这个这个谁。谁谁谁。呃,随着呃消息啊。一头发送。是吧?然后呢,我们再来看这个唯一性处理是什么,就是我们服务端啊,通过采用一定的算法策略。保证同一个业务逻辑啊,不会被重复执行成功。都会被重复执行。成功多次。你要采用一种一一种一种方式,一种算法策略保证他也不是说就保证它一定啊,不能重复执行,你可能可以重复执行了,但你成功不能多次成功。
03:10
你比如说我们刚才我们说这个这个这个订单吧。你同一个对同一个订单啊,你对他多次执行这个支付操作,你只能让他成功一次。对不对啊,例如。嗯,对,同一。对。啊,订单。呃呃多次呃支支付。只会成功。是吧?这是我们说到它的,呃,就是两个要素啊,然后我们再来看解决方案。解决方案它有固定的套路的,大家看啊,对于常见的系统啊,我们这样说的常见系统可不是说非得是热Q啊,那么密等操作的通用性解决方案是第一。
04:06
第一步啊,首先是通过缓存去,这第一步通过缓存去。就是在缓存中,如果已经存在了某幂等。密等令牌,那说明本次操作是重复,重复性操作。而如缓存中没有命中,则进入下一步。不过这里有个问题啊,就是这个。就缓存里边这个密的令牌。从哪来的?我们继续往后看,继续往后看就会就会知道啊啊呃,现在命中了没有啊,没有命中,因为我缓存里面没有啊,没有这个令牌。就我们这说这个令牌嘛,对吧,没有没有进入第二步。那么第二步,在唯一性处理之前,先在我们的数据库里边查询密等令牌。
05:00
作为索引的数据是否存在?如果存在,这说明本次操作。是重复性操作,如果不存在,就进入下一步。这边有同样的问题,你数据库里边这个令牌。从哪儿来的?对吧。而且这这这个也是个问题是吧,我们继续往下看,那肯定是第三步了。其实除了这以外啊,还有一个问题。那你觉得这两步重复了没有?你在这儿已经判断了。能走到这儿,他说明已经不重了呀。你为什么这儿还要再判断,这个判断是不是重复的,他本身是不是重复的。哎,还真是这个问题是吧。继续看啊,我们继续看。嗯,在同一个事物中完成三项操作。同一个事物里边啊,完成参在我们这种事物一般啊,这什么是分布式事物是吧,我们在啊同一个事物里面完成三项操作啊,然后这个三个操,第一项操作什么像微型处理,就我先做微型处理。
06:10
处理过以后呢,我再把幂等令牌写到哪儿?缓存,所以缓存里边的是从这来的,你做完这个密等处理以后,我就把把这个幂等令牌写到了缓存,并将幂等令牌作为唯一所引。作为唯一索引的数据写到DB,所以我数据库缓存里边密的令牌从哪来的?是第三步,我执行完唯一处理以后。完成的。那现在再来说啊。就是这一步。到底。这步重复不重复。和他比。是吧,呃。这里边儿有个问题啊,里边有问题。就是,呃。
07:00
对。呃,第一。已经。嗯。判断。过。已经判断过,呃,是否。呃,是。重复性。操作。啊。为什么?二。第二。还有。再次。判断。这一次判断是否?是否重复?是不是这次判断是不是重复呢?啊,肯定不重啊肯定不重。呃,或者这样说。那第二步。为什么第二步还要再次判断?嗯。能够能够啊,能够。
08:02
进入。二五。呃,说明。已经啊,不是。啊,这次。第二次。诶。第二次判断是否重复是否有必要呢?啊。嗯,当然啊,不重复,为什么。为什么?一般缓存。一般缓存中的数据是。这个。具有什么?笑。旅游。有效。有效期的,比如说我们的对吧,它里边数据是有有效期的呀,你一旦说你这个有效期过了。
09:07
他就会。是不是发生什么缓存啊,是不是啊。村中的,呃,这个这个。传真中数据的有效期。啊,一旦。一旦过期。就会。发生缓存穿透。是吧?缓存。换成传统。啊,使使这个,呃,查虫啊是。是这个这个这个。请求啊,直接就。到达我们的。
10:01
DS。所以我们说第一步查重的目的是什么?第一步,查出目的,呃。就是。啊,为了为了减轻我们BMS它上面的我们的数据库系统它上面的压力。对吧。但是你也就说这这个问题啊,能够进入第二步生物他已经不是重复操作了,这句话本身是错的。你如果这个已经啊,这个缓存啊,这个缓存里边这个已经过期了,它就直接到第二步了。他可能是重复的,他也到了第二步了,所以啊,就这个这两步是都有必要的,这两步都有必要的。能走到这儿。能走到这儿,在。其实就是第一步的时候,在没有缓存,没有过期的情况下,如果你是重复的,直接就给你拦下来了,它就进进不到这儿,所以就减轻了DMS它的压力。
11:00
对吧。
我来说两句