文档章节

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

汉斯-冯-拉特
 汉斯-冯-拉特
发布于 07/23 23:16
字数 530
阅读 4
收藏 0

A-->B

    A在发送请求之前,用乐观锁,减少对B的重复调用,这样一定程度上是幂等性。

    比如A系统支付功能,要调用B系统进行支付操作,但是前端对"支付"按钮不进行控制,即用户会不断多次点击支付按钮,这时A系统会不断的发送请求给B系统(每点击一次就发送一次),如果B系统没有做幂等性设计,那就出问题了,如下图1所示:

                                                 图1  用户的多次请求在A系统中触发了很多个线程,A也对应的多次调用B

    我们是否可以在A系统就把相同的线程过滤掉,如下图2所示:

                             图2 用户的多次请求在A系统中触发了很多个线程,但是都被A过滤了,最后发到B的只有一个请求

    图2中的是怎么实现的呢,可以在A系统的数据库中创建一张表,由于A系统中支付,所以一定存在一个订单Id,我们就使用这个订单Id,加上版本号,来生成一条记录,这样多次支付同一个订单的请求,就只有一个线程会发送到B。用了数据库的乐观锁。

+----------+------------+------+-----+---------+----------------+
| 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。

© 著作权归作者所有

共有 人打赏支持
汉斯-冯-拉特

汉斯-冯-拉特

粉丝 7
博文 216
码字总数 71611
作品 0
渝北
程序员
探索并发编程(七)------分布式环境中并发问题

在分布式环境中,处理并发问题就没办法通过操作系统和JVM的工具来解决,那么在分布式环境中,可以采取一下策略和方式来处理: 避免并发 时间戳 串行化 数据库 行锁 统一触发途径 避免并发 在...

老先生二号
2017/07/30
0
0
Web服务请求异步化介绍(概念篇)

Author:放翁(文初) Date: 2010/6/28 Email:fangweng@taobao.com 围脖: http://t.sina.com.cn/fangweng 前话 在前面的文章中,先给出了Web服务请求异步处理的压力测试报告,从数据角度描述...

晨曦之光
2012/03/09
0
0
系统分布式情况下最终一致性方案梳理

摘要: 前言目前的应用系统,不管是企业级应用还是互联网应用,最终数据的一致性是每个应用系统都要面临的问题,随着分布式的逐渐普及,数据一致性更加艰难,但是也很难有银弹的解决方案,也...

tantexian
2016/11/24
22
0
Hystrix熔断机制原理剖析

一、前言 在分布式系统架构中多个系统之间通常是通过远程RPC调用进行通信,也就是 A 系统调用 B 系统服务,B 系统调用 C 系统的服务。当尾部应用 C 发生故障而系统 B 没有服务降级时候可能会...

阿里加多
05/18
0
0
分布式事务最终一致性常用方案

目前的应用系统,不管是企业级应用还是互联网应用,最终数据的一致性是每个应用系统都要面临的问题,随着分布式的逐渐普及,数据一致性更加艰难,但是也很难有银弹的解决方案,也并不是引入特...

科技小毛
2017/11/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Confluence 6 删除垃圾内容

属性(profile)垃圾 属性垃圾的定义为,一个垃圾用户在 Confluence 创建了用户,但是这个用户在自己的属性页面中添加了垃圾 URL。 如果你有很多垃圾用户在你的系统中创建了属性,你可以使用...

honeymose
今天
0
0
qduoj~前端~二次开发~打包docker镜像并上传到阿里云容器镜像仓库

上一篇文章https://my.oschina.net/finchxu/blog/1930017记录了怎么在本地修改前端,现在我要把我的修改添加到部署到本地的前端的docker容器中,然后打包这个容器成为一个本地镜像,然后把这...

虚拟世界的懒猫
今天
1
0
UML中 的各种符号含义

Class Notation A class notation consists of three parts: Class Name The name of the class appears in the first partition. Class Attributes Attributes are shown in the second par......

hutaishi
今天
1
0
20180818 上课截图

小丑鱼00
今天
1
0
Springsecurity之SecurityContextHolderStrategy

注:下面分析的版本是spring-security-4.2.x,源码的github地址是: https://github.com/spring-projects/spring-security/tree/4.2.x 先上一张图: 图1 SecurityContextHolderStrategy的三个......

汉斯-冯-拉特
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部