文档章节

分布式系统开发库存超卖的解决方法

fzxu_05
 fzxu_05
发布于 2015/12/06 14:20
字数 841
阅读 1083
收藏 8

3个问题经常出现,不解决的话,一定会造成经济损失的

1、同一个请求被发送了多次

可能出现的地方:(1)和别人接口对接,别人同一份数据发送了多次
                                (2)用户在提交按钮里点击了多
                                (3) 其他可能的一些恶意调用,尤其是涉及支付环节的,危险性非常大

解决办法:   (1)  在网页端,用户点击提交后,将按钮disable
                       (2) 对于收到的数据插入到数据库或者其他一些地方,做好唯一键控制

              能够确定唯一的:订单号,或者几个字段拼凑在一起,或者把时间考虑进去,精确到分钟。整个md5一次,放到一个字段里,加个唯一键



2、同一秒内有多次请求

这个就是并发控制,涉及到抽奖等等需要控制到数量的地方,控制不好,会出现抽奖抽多了,卖东西卖超了等情况
出现的原因也很清晰,同一秒内收到多个请求,分布式的,可能不同的请求会分布到不同的机器或者程序上去执行,都去读取一下计数器(记录卖的数量),比如:1,每个请求都各自执行读取操作,发现都是1,没有超出1的限制,然后都来修改计数器为0,然后各自都去发货或者发送奖品,结果造成了卖超。

解决办法:

           利用数据库或者其他有并发控制的程序来做一个锁的逻辑
           利用数据库的话,有一个小技巧提供给大家
           伪代码如下: 

//字段A里存储的是计数器数字,控制最多奖品数量,1个奖品和多个奖品的逻辑有点不一样,注意下面的伪代码  
// 如果是1个奖品  
select  A from 字段B;  
$a  = A;    
if ( $a  == 1)  
{  
     update A=0 where A==1;  
     //如果执行成功,则可以领取奖品  
    //这样可以控制并发时只卖掉一个奖品  
}  
  
  
// 如果是N个奖品  
select  A from 字段B;  
$a  = A;    
if ( $a  <=  N)  
{  
     update A=A-1  where A<=N and A > 0;  
     //如果执行成功,则可以领取奖品  
    //这样可以控制并发时只卖掉N个奖品  
}

3、分布式系统里的超时控制

如果有这样一个分布式业务:用户购买东西,扣钱成功后发货,发货失败的话,退钱给用户

如果A负责处理业务逻辑

B负责扣钱      C负责发货    D负责退钱

正常逻辑1A调用 B扣钱成功的话,C发货
正常逻辑2A调用B扣钱,扣钱成功,调用C发货,C发货失败,调用D退钱
那么A调用C的超时时间一定要足够大,大于C处理发货的时间

否则会出现一种情况:
A调用C发货,超时了,A以为发货失败了,调用D给别人退钱了,结果C发货是成功的,D也把钱退了
所以A调用C发货的系统超时时间一定要远远大于C处理发货的最大时间


© 著作权归作者所有

fzxu_05
粉丝 43
博文 165
码字总数 84201
作品 0
朝阳
程序员
私信 提问
分布式一致性的想法

背景 最近一直在思考,工作这么多年下遇到的分布式系统的一下问题,以及针对这些问题提供的解决方案。 借这个机会,顺便梳理清楚这块知识,希望同大家一起探讨下 常见一致性问题 下订单减库存...

6776jkjk
2017/11/27
0
0
用redis做一个简单的秒杀

下面是一个简单的下单操作 <?phpinclude "MMysql.class.php";$configArr=['host'=>,'port'=>,'user'=>,'passwd'=>,'dbname'=>,];$db = new MMysql($configArr);$sql="select * from sdb_b2c_......

蛋定龙
2015/10/05
4.9K
3
如何解决秒杀的性能问题和超卖的讨论

如何解决秒杀的性能问题和超卖的讨论 最近业务试水电商,接了一个秒杀的活。之前经常看到淘宝的同行们讨论秒杀,讨论电商,这次终于轮到我们自己理论结合实际一次了。 ps:进入正文前先说一点...

fdhay
2016/09/08
222
0
mysql处理高并发,防止库存超卖

先来就库存超卖的问题作描述:一般电子商务网站都会遇到如团购、秒杀、特价之类的活动,而这样的活动有一个共同的特点就是访问量激增、上千甚至上万人抢购一个商品。然而,作为活动商品,库存...

凯文加内特
2016/01/25
785
0
Java解决高并发下商品库存更新

一、问题分析 先来就库存超卖的问题作描述:一般电子商务网站都会遇到如团购、秒杀、特价之类的活动,而这样的活动有一个共同的特点就是访问量激增、上千甚至上万人抢购一个商品。 然而,作为...

嘴角轻扬30
01/02
104
0

没有更多内容

加载失败,请刷新页面

加载更多

rime设置为默认简体

转载 https://github.com/ModerRAS/ModerRAS.github.io/blob/master/_posts/2018-11-07-rime%E8%AE%BE%E7%BD%AE%E4%B8%BA%E9%BB%98%E8%AE%A4%E7%AE%80%E4%BD%93.md 写在开始 我的Arch Linux上......

zhenruyan
今天
5
0
简述TCP的流量控制与拥塞控制

1. TCP流量控制 流量控制就是让发送方的发送速率不要太快,要让接收方来的及接收。 原理是通过确认报文中窗口字段来控制发送方的发送速率,发送方的发送窗口大小不能超过接收方给出窗口大小。...

鏡花水月
今天
10
0
OSChina 周日乱弹 —— 别问,问就是没空

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @tom_tdhzz :#今日歌曲推荐# 分享容祖儿/彭羚的单曲《心淡》: 《心淡》- 容祖儿/彭羚 手机党少年们想听歌,请使劲儿戳(这里) @wqp0010 :周...

小小编辑
今天
1K
11
golang微服务框架go-micro 入门笔记2.1 micro工具之micro api

micro api micro 功能非常强大,本文将详细阐述micro api 命令行的功能 重要的事情说3次 本文全部代码https://idea.techidea8.com/open/idea.shtml?id=6 本文全部代码https://idea.techidea8....

非正式解决方案
今天
5
0
Spring Context 你真的懂了吗

今天介绍一下大家常见的一个单词 context 应该怎么去理解,正确的理解它有助于我们学习 spring 以及计算机系统中的其他知识。 1. context 是什么 我们经常在编程中见到 context 这个单词,当...

Java知其所以然
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部