前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >并发设计之A系统调用B系统 原

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

作者头像
克虏伯
发布2019-04-15 11:07:40
4340
发布2019-04-15 11:07:40
举报

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。用了数据库的乐观锁。

代码语言:javascript
复制
+----------+------------+------+-----+---------+----------------+
| 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。

(adsbygoogle = window.adsbygoogle || []).push({});

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018/07/23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档