并发设计之A系统调用B系统

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

相关文章
相关标签/搜索