文档章节

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

克虏伯
 克虏伯
发布于 07/23 23:16
字数 530
阅读 12
收藏 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。

© 著作权归作者所有

共有 人打赏支持
克虏伯

克虏伯

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

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

老先生二号
2017/07/30
0
0
操作系统复习题-第一章 操作系统引论

第一章 操作系统引论 一、单项选择题 1、操作系统是一种( B )。 A.应用软件 B. 系统软件 C.通用软件 D. 工具软件 2、操作系统是一组( C )。 A.文件管理程序 B.中断处理程序 C.资源管理程...

harry_h
06/18
0
0
系统分布式情况下最终一致性方案梳理

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

tantexian
2016/11/24
22
0
Web服务请求异步化介绍(概念篇)

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

晨曦之光
2012/03/09
0
0
Hystrix熔断机制原理剖析

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

阿里加多
05/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

初级开发-编程题

` public static void main(String[] args) { System.out.println(changeStrToUpperCase("user_name_abc")); System.out.println(changeStrToLowerCase(changeStrToUpperCase("user_name_abc......

小池仔
今天
4
0
现场看路演了!

HiBlock
昨天
12
0
Rabbit MQ基本概念介绍

RabbitMQ介绍 • RabbitMQ是一个消息中间件,是一个很好用的消息队列框架。 • ConnectionFactory、Connection、Channel都是RabbitMQ对外提供的API中最基本的对象。Connection是RabbitMQ的s...

寰宇01
昨天
9
0
官方精简版Windows10:微软自己都看不过去了

微软宣布,该公司正在寻求解决方案,以减轻企业客户的Windows 10规模。该公司声称,企业客户下载整个Windows 10文件以更新设备既费钱又费时。 微软宣布,该公司正在寻求解决方案,以减轻企业...

linux-tao
昨天
14
0
TypeScript基础入门之JSX(二)

转发 TypeScript基础入门之JSX(二) 属性类型检查 键入检查属性的第一步是确定元素属性类型。 内在元素和基于价值的元素之间略有不同。 对于内部元素,它是JSX.IntrinsicElements上的属性类型...

durban
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部