首页 > 其他分享 >秒杀项目的重要问题

秒杀项目的重要问题

时间:2024-04-11 16:58:34浏览次数:15  
标签:重要 请求 项目 数据库 Redis 用户 限流 秒杀 分布式

核心问题

  • 每秒上万次请求
  • 数据一致性(超买超买复购)
  • 响应速度(用户反馈)

每秒上万次请求的后果

短时间内,上万个数据库连接同时达到,数据库崩溃。数据库处理大量请求,如果一个IO耗时100ms,大量的请求冲进数据库,响应速度将十分缓慢。

限流策略

通常秒杀商品数量远远小于参与用户,而且用户在秒杀时,可能会大量点击,可能产生大量请求。因此要限制大部分流量。只允许小部分流量进入后端处理流程。

  • 为了应对用户刷接口首先就要避免暴露秒杀接口。如果用户知道了接口url,就可以通过脚本大量一秒发几百次请求,非常恐怖。前端,限制用户点击,如果一个用户点了按钮,那么按钮变灰或者5s内不能再点。
  • 反向代理层,Nginx限流,通过limit_req_zone、limit_req指令配合完成,限制单ip、单服务的流量,甚至可限制goodsId限流。
  • 可通过Redis计数器或令牌桶策略限制单个用户访问接口的次数,请求没有抢到令牌则拒绝后续流程;在前端,通过按钮置灰、控制用户点击次数的方法减少用户大量发请求。
  • 利用缓存。通过缓存避免到数据库读取数据。如将商品信息缓存,减少不必要的读请求。为了避免抢购前都到db中查询库存,还可以通过预减缓存。比如:在Redis中预设置秒杀商品库存,请求进入后端,首先用decr预减库存。若结果<0,则库存耗尽,服务器直接返回秒杀失败结果。此外,秒杀页面适合做成静态页面,提高加载速度。
  • 消息队列将数据库读写异步化。Redis并发量远远大于Mysql,就算用了前面的各种策略,也还是会有大量请求冲进来压垮数据库。因此,可以将大量读写请求异步化,这里用到了消息队列。
    消息队列可作为缓冲区,将写请求缓存起来,避免请求直接涌向数据库。异步处理:将生成订单、扣库存等流程分开,提高处理效率,及时给用户反馈(避免用户界面一直转圈);

超卖超买的问题

使用Mysql中的锁

  • 行锁、表锁
    事务开始时,执行select ... for update加行锁,注意,行锁必须依赖索引!如果不用索引,就会锁住全表。此外,不能锁同一个索引。

    select ... where goodID = 12345 for update

  • 事务隔离级别:串行化(并发量很低)

分布式锁

Redis分布式锁或Zookeeper分布式做。Redis分布式锁性能更高。

请求排队处理

使用消息队列结合分布式锁保证数据一致性

对于分布式项目

  1. 应对高并发:负载均衡,节点水平拓展,数据库读写分离,增加示例数量
  2. 使用Sentinel限流熔断
  3. 分阶段顺序执行先在redis预减库存,Redis的吞吐量远远大于DB,decr具有原子性,能够安全、准确的减库存。预减库存后进入消息队列,这时候可通过分布式锁。比如根据商品id对应一个分布式锁,同时刻同一个商品只允许一个服务进行修改。

标签:重要,请求,项目,数据库,Redis,用户,限流,秒杀,分布式
From: https://www.cnblogs.com/nammonco/p/18129555

相关文章

  • 记录真实项目中遇到的bug--007:排序展示bug
    T07:排序展示bug:1.优先级:T22.前提条件:用户A打开日历3.预期结果:日历行程展示按照业务提供的sort顺序进行排序。4.实际结果:日历行程展示的时间段在9点之前的顺序不符合预期。5.缺陷跟踪:后端按照sort字段排序,更改为9点之前的时间段前面加0,例如原先的9:45,改为09:45,后达到预期......
  • 充电桩项目敏捷开发实践分享
    推荐语充电桩项目采用敏捷模式,可以直观地感受到交付效率的提升。作为一个从0到1的、且涉及到硬件厂商、物联网的项目,在短时间内成功地完成了业务迫切需要的功能,并做到了大规模的稳定运营。在此过程中,产品和技术同学通过日常、早会和周会等形式沟通协作,研发工程师也积极参与到业......
  • AndroidStudio构建项目耗时太长优化办法
    新建AndroidStudio项目时,常会因为网络问题导致部分依赖下载缓慢,其中gradle和kotlin这两个模块最拖慢进度。解决方案:对gradle.properties和settings.gradle.kts这两个配置文件进行修改 对gradle.properties#Project-wideGradlesettings.#IDE(e.g.AndroidStudio)use......
  • SpingBoot项目Tomcat假死,导致http(openfeign)请求无法响应问题定位
    项目简介:<spring-boot.version>2.3.2.RELEASE</spring-boot.version><spring-cloud.version>Hoxton.SR12</spring-cloud.version>使用docker进行项目部署问题描述:项目中代码中大量使用异步多线程操作,没个异步过程中大量掺杂数据库查询、Redis查询、Feign调用、RabbitMq发送接收......
  • jar命令更新SpringBoot项目jar包里的补丁文件
    最近在因为项目依赖了太多微服务的包,所以项目经常报错,又因为在联调接口,需要经常打包,所以想直接在springboot项目的一个jar包直接加上自己的补丁,然后重新部署就行,提高效率使用压缩软件打开jar,然后往里面直接替换class文件,不过启动后,会报错Causedby:java.lang.IllegalStateExc......
  • github-webhook+docker实现项目可持续自动化部署
    目录一、项目手动部署二、项目自动部署自动构建部署流程docker概念补充使用nginx+pm2+github-webhook+docker实现项目自动部署注:docker也能实现pm2的守护进程功能(持续启动项目),所以使用了docker就不需要使用pm2了但是需要注意的是使用node启动的webhook服务器不......
  • 鸿蒙开发人才紧缺!这些项目帮你快速上手HarmonyOS!
    去年9月,华为宣布鸿蒙原生应用全面启动,基于开源鸿蒙开发的HarmonyOSNEXT鸿蒙星河版将在今年秋天正式和消费者见面。该版本系统底座将由华为全线自研,去掉传统安卓AOSP代码。这意味着,鸿蒙星河版将不再兼容安卓应用,京东、淘宝、得物、美团、微博、小红书等上百款应用也相......
  • 在readme.md中使用及生成项目目录结构
    在项目开发过程中,为了提升文档的可读性,我们通常需要在readme.md文件中展示项目的目录结构。这不仅有助于团队成员快速了解项目构成,同时也方便了外部贡献者对项目的认识。手动编写目录结构不仅耗时而且容易出错,因此我们可以利用tree命令自动化地生成目录树。一、生成详细目录环境......
  • 数据可视化-ECharts Html项目实战(11)
    在之前的文章中,我们学习了如何在ECharts中特殊图表的双y图以及自定义形状词云图。想了解的朋友可以查看这篇文章。同时,希望我的文章能帮助到你,如果觉得我的文章写的不错,请留下你宝贵的点赞,谢谢。数据可视化-EChartsHtml项目实战(10)-CSDN博客文章浏览阅读775次,点赞20次,收藏16次......
  • 在远程windows上调试Cmake项目 C++
    记录一下CMake项目MSVC编译器远程调试方法参考资料  教程:在远程Windows计算机上调试CMake项目|MicrosoftLearn1.使用VS打开cmake项目2.右键main.cpp文件,添加调试配置选择C++ 3.会打开一个launch.vs.json文件 配置一下 注意:远程机器那里写需要运行的机器号 ......