博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
并发设计之A系统调用B系统
阅读量:5892 次
发布时间:2019-06-19

本文共 1033 字,大约阅读时间需要 3 分钟。

hot3.png

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。

转载于:https://my.oschina.net/u/2518341/blog/1861720

你可能感兴趣的文章
Android NDK入门实例 计算斐波那契数列一生成jni头文件
查看>>
c/c++性能优化--I/O优化(上)
查看>>
将HTML特殊转义为实体字符的两种实现方式
查看>>
jquery 保留两个小数的方法
查看>>
网站架构设计的误区
查看>>
Standard C++ Programming: Virtual Functions and Inlining
查看>>
iis 故障导致网站无法访问
查看>>
C++ 基础笔记(一)
查看>>
System.Func<>与System.Action<>
查看>>
asp.net开源CMS推荐
查看>>
csharp skype send message in winform
查看>>
MMORPG 游戏服务器端设计--转载
查看>>
《星辰傀儡线》人物续:“灭世者”、“疯狂者”、“叛逆者”三兄妹
查看>>
安装系统字体
查看>>
SILK 的 Tilt的意思
查看>>
Html学习笔记3
查看>>
批处理学习笔记8 - 深入学习For命令1
查看>>
ActiveX控件的安全初始化和脚本操作 和 数字签名SIGN
查看>>
Eclipse console文本换行
查看>>
微信支付开发(11) Native支付
查看>>