来源:cnblogs.com/dreamworlds/p/5398468.html

1、并发队列的选择

Java的并发包提供了三个常用的并发队列实现,分别是:ArrayBlockingQueue、ConcurrentLinkedQueue 和 LinkedBlockingQueue 。

ArrayBlockingQueue是初始容量固定的阻塞队列,我们可以用来作为数据库模块成功竞拍的队列,比如有10个商品,那么我们就设定一个10大小的数组队列。

ConcurrentLinkedQueue使用的是CAS原语无锁队列实现,是一个异步队列,入队的速度很快,出队进行了加锁,性能稍慢。

LinkedBlockingQueue也是阻塞的队列,入队和出队都用了加锁,当队空的时候线程会暂时阻塞。

在请求预处理阶段,由于我们的系统入队需求要远大于出队需求,一般不会出现队空的情况,所以我们可以选择ConcurrentLinkedQueue来作为我们的请求队列实现。

2、请求接口的合理设计

一个秒杀或者抢购页面,通常分为2个部分,一个是静态的HTML等内容,另一个就是参与秒杀的Web后台请求接口。

通常静态HTML等内容,是通过CDN的部署,一般压力不大,核心瓶颈实际上在后台请求接口上。这个后端接口,必须能够支持高并发请求,同时,非常重要的一点,必须尽可能“快”,在最短的时间里返回用户的请求结果。

为了实现尽可能快这一点,接口的后端存储使用内存级别的操作会更好一点。仍然直接面向MySQL之类的存储是不合适的,如果有这种复杂业务的需求,都建议采用异步写入。

当然,也有一些秒杀和抢购采用“滞后反馈”,就是说秒杀当下不知道结果,一段时间后才可以从页面中看到用户是否秒杀成功。

但是,这种属于“偷懒”行为,同时给用户的体验也不好,容易被用户认为是“暗箱操作”。推荐:秒杀系统设计的 5 个要点。

3、高并发下的数据安全

我们知道在多线程写入同一个文件的时候,会存现“线程安全”的问题(多个线程同时运行同一段代码,如果每次运行结果和单线程运行的结果是一样的,结果和预期相同,就是线程安全的)。

如果是MySQL数据库,可以使用它自带的锁机制很好的解决问题,但是,在大规模并发的场景中,是不推荐使用MySQL的。秒杀和抢购的场景中,还有另外一个问题,就是“超发”,如果在这方面控制不慎,会产生发送过多的情况。

我们也曾经听说过,某些电商搞抢购活动,买家成功拍下后,商家却不承认订单有效,拒绝发货。这里的问题,也许并不一定是商家奸诈,而是系统技术层面存在超发风险导致的。

超发的原因

假设某个抢购场景中,我们一共只有100个商品,在最后一刻,我们已经消耗了99个商品,仅剩最后一个。

这个时候,系统发来多个并发请求,这批请求读取到的商品余量都是1个,然后都通过了这一个余量判断,最终导致超发。(同文章前面说的场景)

在上面的这个图中,就导致了并发用户B也“抢购成功”,多让一个人获得了商品。这种场景,在高并发的情况下非常容易出现。

悲观锁思路

解决线程安全的思路很多,可以从“悲观锁”的方向开始讨论。

悲观锁,也就是在修改数据的时候,采用锁定状态,排斥外部请求的修改。遇到加锁的状态,就必须等待。

虽然上述的方案的确解决了线程安全的问题,但是,别忘记,我们的场景是“高并发”。也就是说,会很多这样的修改请求,每个请求都需要等待“锁”,某些线程可能永远都没有机会抢到这个“锁”,这种请求就会死在那里。

同时,这种请求会很多,瞬间增大系统的平均响应时间,结果是可用连接数被耗尽,系统陷入异常。

FIFO队列思路

那好,那么我们稍微修改一下上面的场景,我们直接将请求放入队列中的,采用FIFO(First Input First Output,先进先出),这样的话,我们就不会导致某些请求永远获取不到锁。看到这里,是不是有点强行将多线程变成单线程的感觉哈。

然后,我们现在解决了锁的问题,全部请求采用“先进先出”的队列方式来处理。那么新的问题来了,高并发的场景下,因为请求很多,很可能一瞬间将队列内存“撑爆”,然后系统又陷入到了异常状态。

或者设计一个极大的内存队列,也是一种方案,但是,系统处理完一个队列内请求的速度根本无法和疯狂涌入队列中的数目相比。

也就是说,队列内的请求会越积累越多,最终Web系统平均响应时候还是会大幅下降,系统还是陷入异常。

乐观锁思路

这个时候,我们就可以讨论一下“乐观锁”的思路了。乐观锁,是相对于“悲观锁”采用更为宽松的加锁机制,大都是采用带版本号(Version)更新。

实现就是,这个数据所有请求都有资格去修改,但会获得一个该数据的版本号,只有版本号符合的才能更新成功,其他的返回抢购失败。

这样的话,我们就不需要考虑队列的问题,不过,它会增大CPU的计算开销。但是,综合来说,这是一个比较好的解决方案。

有很多软件和服务都“乐观锁”功能的支持,例如Redis中的watch就是其中之一。通过这个实现,我们保证了数据的安全。

秒杀系统必须考虑的 3 个技术问题!相关推荐

  1. 阿里双十一秒杀系统架构设计,有哪些技术关键点?

    马上要到双11了,就来谈谈如何设计一个秒杀系统架构 技术挑战 1. 对原有业务形成冲击 秒杀活动只是网站营销的一个附加活动,特点是:时间短.并发访问量大,如果和网站原有应用部署在一起,必然会对现有业务 ...

  2. 某系统有6台输出设备 有多个进程均需要使用2台_双11的秒杀系统,是如何设计的?...

    双11临近,又到了剁手时节.每年双11电商的秒杀玩法层出不穷,秒杀系统几乎成了所有互联网公司的"标配". 秒杀系统中涉及到的很多技术点也是一二线大厂面试重点考察的点.秒杀系统也是我 ...

  3. 十个面试九个秒杀,你设计的秒杀系统真的过关了吗?

    双十一期间,秒杀玩法在电商,直播带货业务中运用的非常广泛,越来越多的秒杀玩法不断出现,秒杀系统几乎成了所有互联网公司的"标配" 秒杀系统中涉及到的很多技术点也是许多一二线大厂面试重 ...

  4. 秒杀系统的技术架构设计与实现

    作者:绘你一世倾城 来源:https://juejin.im/post/5d84e21f6fb9a06ac8248149 每到节假日期间,一二线城市返乡.外出游玩的人们几乎都面临着一个问题:抢火车票! ...

  5. 关于“秒杀”系统的技术分析

    在这里,你可以找到各团队的技术实践总结.填坑案例.新技术学习笔记.基本功修炼.团队管理经验.成长感悟等丰富内容.同时,我们也需要有才华的你,把个人博客里的精华文章分享出来,大家一起长期有耐心,做有积累 ...

  6. 秒杀系统的技术挑战、应对策略以及架构设计总结一二!

    参考书籍 | <大型网站技术架构> | 李智慧 整理 | 公众号 |  Justin谈开发 一.什么是秒杀? 秒杀是电商常见的一种营销手段:将少量的商品,以极低的价格,在特定的时间点开始出 ...

  7. 秒杀系统(二)——商品模块展示技术难点

    秒杀系统--商品模块展示技术难点 商品详情页 商品详情页是展示商品详细信息的一个页面,承载在网站的大部分流量和订单的入口.京东商城目前有通用版.全球购.闪购.易车.惠买车.服装.拼购.今日抄底等许多套 ...

  8. 电商平台-“秒杀”系统技术难题及解决方案

    电商平台-"秒杀"系统技术方案 文章目录 电商平台-"秒杀"系统技术方案 前言 一.什么是秒杀? 二.秒杀的技术难点? 1.避免对现有网站的冲击 2.高效解决网 ...

  9. 网购秒杀系统架构设计案例分析——《大型网站技术架构》笔记

    一.核心思想: 网站秒杀时的并发比正常运营时多的多,所以网站的秒杀业务不能使用正常的网站业务流程,也不能和正常的网站交易业务共用服务器(否则造成巨大浪费),必须设计部署专门的秒杀系统,进行专门应对 二 ...

最新文章

  1. 【Java】字符串(二)
  2. C#调用TSC条码打印机打印二维码(转)
  3. Kibana模块——介绍
  4. Windows Server 2008 R2 DNS 服务器迁移方法
  5. 五菱宏光s1图片及价格图片_全新五菱宏光S来了,还在念念不忘S1吗?国六机头还颜值在线...
  6. 6.openldap客户端安装
  7. 基于JavaSwing+Mysql点餐系统设计和实现
  8. eigen库学习笔记
  9. CentOS 7主机名修改与查看命令详述
  10. #地形剖面图_七年级上册微课 | 地图:地形剖面图与分层设色地形图
  11. python selenium--常用函数3
  12. Flutter拓展 一步一步教你安装Flutter(最火的移动框架)
  13. 【POCKET 51】用 pocket 51学51单片机 之四:pocket 51功能模块测试
  14. 菜鸟驿站是什么快递_菜鸟驿站是什么快递
  15. canvas圆形、半圆形进度条
  16. 云原生之使用Docker部署Python应用
  17. ArcGIS之多个GDB批量导出shp至特定文件夹20201228
  18. android AMS
  19. 认知科学期末复习笔记
  20. Android设备管理器

热门文章

  1. Java B2B2C多用户商城 springcloud架构- common-service 项目构建过程(七)
  2. CSharpGL(50)使用Assimp加载骨骼动画
  3. 16.1 Tomcat介绍16.2 安装jdk16.3 安装Tomcat
  4. Android爬坑之旅之WebView
  5. crypto-js RC4和hash_hmac运用
  6. LeetCode 75 Sort Colors(颜色排序)
  7. 为你的移动页面寻找一丝新意——手机互动网页项目总结(上)
  8. Qt串口通信类Posix_QextserialPort中flush()函数修正
  9. Python获取当前工作目录
  10. 告诉你Hadoop是什么