A-->B前端
A在发送请求以前,用乐观锁,减小对B的重复调用,这样必定程度上是幂等性。数据库
好比A系统支付功能,要调用B系统进行支付操做,可是前端对"支付"按钮不进行控制,即用户会不断屡次点击支付按钮,这时A系统会不断的发送请求给B系统(每点击一次就发送一次),若是B系统没有作幂等性设计,那就出问题了,以下图1所示:bash
图1 用户的屡次请求在A系统中触发了不少个线程,A也对应的屡次调用B线程
咱们是否能够在A系统就把相同的线程过滤掉,以下图2所示:设计
图2 用户的屡次请求在A系统中触发了不少个线程,可是都被A过滤了,最后发到B的只有一个请求code
图2中的是怎么实现的呢,能够在A系统的数据库中建立一张表,因为A系统中支付,因此必定存在一个订单Id,咱们就使用这个订单Id,加上版本号,来生成一条记录,这样屡次支付同一个订单的请求,就只有一个线程会发送到B。用了数据库的乐观锁。blog
+----------+------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------+------------+------+-----+---------+----------------+ | id | bigint(20) | NO | PRI | NULL | auto_increment | | order_id | bigint(20) | YES | | NULL | | | version | int(11) | YES | | 0 | | +----------+------------+------+-----+---------+----------------+ 3 rows in set (0.00 sec)
每一个线程都执行update table set version=version+1 where order_id=#{orderId};这个就经过乐观锁,只有一个线程会成功修改这条记录,咱们只让修改version成功的那个线程发送请求到B。rem