制作做的网站如何上传网上,北京网页制作服务,万业网网站建设审核,免费云服务器永久使用下载唉 就记得当时抢冰墩墩的时候的秒杀了
我们要注意什么问题呢?
1.几百万人在这个瞬间抢冰墩墩 这个瞬间会有大量的请求 服务器要能抗的住
2.不能超卖,就那些冰墩墩 卖多了压根没有 好不容易抢到你说没货了怕不是要被冲烂
3.避免少卖 拢共就那些 你再少卖点 没屁了
4.防黄牛…唉 就记得当时抢冰墩墩的时候的秒杀了
我们要注意什么问题呢?
1.几百万人在这个瞬间抢冰墩墩 这个瞬间会有大量的请求 服务器要能抗的住
2.不能超卖,就那些冰墩墩 卖多了压根没有 好不容易抢到你说没货了怕不是要被冲烂
3.避免少卖 拢共就那些 你再少卖点 没屁了
4.防黄牛 还是那个道理 拢共就五百个 黄牛每人嗯造十个 没了 高并发问题
基本解决高并发的方法都是 削峰、限流、异步、补偿
异步这一步可以通过消息队列来实现将抢和购解耦还可以很方便地限频不至于让MySQL过度承压。抢的话使用Redis来做处理因为Redis处理 简单的扣减请求是非常快的而直接到MySQL是比较力不从心。 Redis可是单机支撑每秒几万的写入并且可以做成集群提高扩展能力的。我们可以先将库存名额预加载到Redis,然后在Redis中进行扣减扣减成功的再通过消息队列传递到MySQL做真 正的订单生成。 超卖问题
第一步判断库存名额是否充足; 第二步减少库存名额扣减成功就是抢到。
用LUA把这两个捆绑成一个原子操作就好
1.正常业务错误比如库存用完这种情况符合预期直接返回给用户即可。 2.访问Redis错误这种情况返回给用户,让其重试即可 3.访问Redis超时这种情况下其实可能库存已经扣减成功此时不用再重试免费产生更多的无效扣减虽然多了一次扣减但是总数是不变的只会少卖不会多卖。 少卖问题
少卖什么情况会出现呢?库存减少了,但用户订单没生成。 什么情况会这样呢?有几种可能: 1..上面提到的减少库存操作超时但实际是成功的因为超时并不会进入生成订单流程; 2.在Redis操作成功但是向Kafka发送消息失败这种情况也会白白消耗Redis中的库存。
说白了,我们只需要保证Redis库存 Kafka消耗的最终一致性。 ●第一种也最简单的方式在投递Kafka失败的情况下增加渐进式重试;
(成功的可能性越来越小 他就越来越懒) ●第二种,更安全一点就是在第一种的基础上,将这条消息记录在磁盘上,慢慢重试; ●第三种写磁盘之前就可能失败可以考虑走WAL路线但是这样做下去说不定就做成MySQL的undo log, redo log这种WAL技术了会相当复杂没有必要。 一般都用第二种
怎么解决黄牛呢
首先我们可以每个id限购一个
第一步查询库存第二步扣减库存需要优化为第一步查询库存 第二步查询用户己购买个数第三步扣减库存第四步记录用户购买数。(用LUA保证原子性) 这里需要注意的是如果使用Redis集群那么Redis的数据分片需要根据用户来分Key,不然用户数据会查询不到。 有了限购,我们可以保证货品不会被黄牛占据太多 那么还剩一个问题黄牛大多是通过代码来抢购点击速度比人点击快得多这样就导致了竞争不公平。(我当时就是用了一个秒杀脚本 说实话 收获甚微) 怎么解决呢?某个用户请求接口次数过于频繁一般说明是用脚本在跑 可以只针对该用户做限制。 针对IP做限制也是常见做的做法但这样容易误杀主要考虑到使用同一个网络的用户可能都是一个出口IP。 限制IP会导致正常用户也受到影响。 更好用的方案是加上一个验证码验证。 验证码符合91原则(啊.....)90%的时间都用在验证码输入上,所以使用脚本点击的影响会降到很低。