范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

写个简易版秒杀系统练练手

  不写文章还有点不自在,完了
  今天来分享下这段时间学习的一个秒杀项目,黑马点评。
  好久没跟着学这些,感觉非常非常好玩,又想捣鼓点项目玩玩了 哈哈。
  我也简单搭建了一个,用到了这些技术。
  Springboot2 + Redis7 + Lua + Redisson + MySQL8 + RabbitMQ3.9 + MybatisPlus + Hutool
  其中  Redis  和 MySQL  都是之前搭建在云端的 K8S  上的 主从 结构,用 Traefik  做总网关。
  RabbitMQ  则是之前在本地虚拟机上用 docker 搭建的 ,还有 Prometheus  + Grafana  监控。 思路
  隐藏秒杀地址
  这个就是实现一个用户一个地址,给脚本工具加点难度。
  根据需要生成这个 path,比如用 md5 混淆下 。
  然后放到 Redis 中 key :秒杀活动ID+’path‘ + 秒杀商品ID+用户ID , value :path
  真实的秒杀地址如下
  lua 脚本预扣库存
  用 lua 脚本来保证这个操作的原子性,判断 库存key 存不存在,数量够不够,够的话执行扣减操作
  bug
  我这样写的脚本是有问题的,没有进行  重复订单校验  , 以及 set 这个 订单信息 到 redis 中。
  这 3 步操作应该是原子性的, 校验,扣减,设置
  所以即便 lua 脚本能保证操作的原子性,但是并发情况下会出现  少卖  的情况。
  模拟同个用户 50 个并发
  改正版
  改正后也就正常了,之前我是老想着 订单ID 的生成要从  分布式ID  中获取,想尽量较少这个 网络请求 的,一不小心就疏忽了。(以后得先把 核心思路 写下,再思考优化,不能边写边想优化了 )
  分布式ID  ,我之前研究这个 美团Leaf  也是想简单搭建一个,奈何总喜欢偷懒,这里我是用 Hutool  的 雪花算法  简单生成的。
  保存订单信息到 Redis
  出  大bug  之前,我以为这里只是做 重复订单校验  的,没想到,还有这种情况
  MQ 挂了 ,消息还没发送出去,甚至一开始就没连接上 的情况。
  比如 我这个本机和虚拟机 休眠后得重启下  虚拟网络vm8 ,不然连不上去。
  意料之外~
  所以,这里得写个小脚本,将 订单信息 发送到 MQ 中,在紧急情况下能快速补救。  分布式锁
  目前用 jvm 级别的锁其实就足够了,但后面上集群还得改代码,干脆一鼓作气。
  锁的粒度,不能太大,主要防止用户重复下单。
  比如  第一版 错误的 lua 脚本中,就会出现  重复下单  的情况 集群模式下,多个消费者的情况,此时谁先拿到分布式锁,谁就可以消费这个订单, 避免重复下单
  通过分布式锁,保证这个订单只有一个消费者消费,即便在多个消费者模式下,也不会出现  重复下单  的情况。
  同时,也可以防止使用 Redis 出现意外,就像上面  错误使用 lua 脚本的案例 ,以及 可能存在的 key 过期等问题导致的重复下单问题。
  当然,这还不是  兜底方案  ,万一这个 分布式锁  也出现意外了呢,所以保险起见,还需要给 订单表 建立 唯一索引 (用户id+商品id),靠数据库本身保证了。
  这里如果不用分布式锁,那就得从数据库层面去保证了,得用 select …… for update 开启  悲观锁 ,那效率会进一步降低的。
  注意,这里也是   缓存击穿   的常见解决思路,分布式锁,双重检查锁模式。  事务
  我这里是简易版的,没有涉及到 分库分表,所以也谈不上这个 分布式事务。
  这里我用的  编程式事务  ,毕竟 扣减库存和保存订单 要在一个事务里,用注解的话还得考虑这个失效 的场景,获取这个代理对象去执行,没有这个 编程式事务  来得方便。
  假设 订单在订单库中,商品在商品库中,那这种情况下,是不是还得考虑这个  分布式事务  呢?
  我可能还是不会选择这个  分布式事务  ,我会直接往 商品库 中 建立一个 秒杀订单表  或者在 订单库  中建立这个 秒杀商品库存表,甚至专门弄一个 秒杀库  , 冗余  一下,事后如果需要同步到相应的 库表 中,再进行相关的操作。
  那假如还有个积分系统呢 ?
  比如 支付回调后,更新订单状态的同时,还要更新这个用户积分。
  这我还是会选择 MQ ,通过 MQ 的可靠性 来达到这个  最终一致性
  先发送消息到积分系统,更新订单信息单独在事务中。
  这是分布式事务中常见的一种解决方案  基于MQ可靠性消息的最终一致性方案 。
  有时间可以学习下 Seata
  重试机制
  上图将 MySQL 和 MQ 的操作放一起,还得小心这个 MQ 的异常,导致这个  事务回滚 ,但是 ACK 还是正常发出去的情况。
  这里我最后还将异常抛出去,是为了触发这个  重试机制  ,配置文件中 开启 RabbitMQ 消费者重试机制即可。
  ACK 前发生异常,事务回滚,触发重试机制。
  ACK 中发生异常,捕获,丢弃异常,提交事务。再次消费时,发现是重复订单。
  ACK 后还有异常,未捕获,事务回滚,但消息已经被 ACK,触发了重试机制,在重试期间没有异常,则正常处理。如果重试后还有异常,则会出现 消息丢失 的情况,这又得   紧急处理   了。  防止超卖
  有两个扣减动作
  Redis 预扣库存,这里得在  lua 脚本 中操作。
  MySQL 扣减库存,这里核心就是  乐观锁的方式  a=a-1 where a > 0;
  缓存
  这里再简短啰嗦下  缓存穿透
  针对不存在的 key ,可以用   布隆过滤器   缓存击穿
  key 刚好过期,或者   商品成了爆款
  用  分布式锁  , 双重检查锁模式  能解决上面这两种情况,锁的粒度也是这个 商品。
  针对 key 刚好过期 的情况,我了解到一种新的处理思路: 逻辑过期
  不在 Redis 中判断是否过期,在 代码 中进行判断,过期的话获取锁,开线程去更新,但实现起来比较复杂。  缓存雪崩
  大量 key 同时过期,可以   给不同的Key的TTL添加随机值   , 给业务添加多级缓存   , 降级限流策略安排上   总结
  到这里,这个简易秒杀系统就介绍完了,至于 限流,用户鉴权,标记 ,订单支付,超时处理,消息的顺序性 …… 再到大一点的 集群,缓存一致性 等等东西,得抽空再完善下了。
  搭建过程中,最有意思的是,一直防着  超卖 ,结果还出现了 少卖  的场景
  所以这 Redis 预扣库存 也得谨慎呀, lua脚本  三合一疗程:查,扣,存
  MySQL 也一样, 分布式锁 ,事务  ,查,扣,存
  希望到时能把笔记中的技术都过一遍。
  学习笔记
  下面是我用 JMeter 测试的一些数据情况  JMeter
  这里两个 http 请求分别模拟, 获取秒杀地址 ,开始秒杀 。
  jmeter 500 个并发,100 件库存
  报告一
  这个 平均响应 是 326 ms , 50 % 的请求是 245 ms,99% 是 1342 ms ,最小是 21 ms,最大是 1359 ms ,吞吐量是 605/s 。
  这个成绩…一言难尽,这还是用了  MQ 异步下单  ,还有 内存标记 ,Redis 预扣库存 的结果,而且是 预热了 JVM  的情况
  这最大的开销应该是网络问题,要访问 云服务器 K8S 中的 Redis 以及 本地虚拟机上的 MQ。
  或者是我的老伙计性能问题,又得跑项目,还得测试,这 CPU ,内存,网卡 估计也忙坏了。
  简单分析下
  获取秒杀地址  , 这里就访问一次 Redis ,执行 Set 命令。
  开始秒杀  中,涉及的网路操作有 校验地址  是否重复下单  预扣库存 lua 脚本  发送订单信息到 MQ(虚拟机上)
  后面把项目搭建到云服务器上再来测下。  报告二
  这里看到 第一个请求 的 RT 都比第二个请求的 小。
  Redis
  Redis 内存使用情况(测试前)
  Redis 内存使用情况(使用后)
  可以看到,内存多了 0.1M 左右,这是多了 601 个 key
  至于怎么多了 32 条 client connection , 只能做个简单的推测先了
  项目中使用了这个 redisson 做分布式锁,占用了 25 条
  简单看下源码
  拿到服务器上的所有连接,排掉之前的 5 条,刚好剩下 32 条。
  这里看到使用 resp3 的有 7 条,刚好符合,应该是 RedisTemplate 相关创建的。
  这里简单看下源码, Redis 6 开始默认使用 RESP3 的协议的
  RabbitMQ
  下面是从 Prometheus + Grafana 监控截取的
  RabbitMQ 使用情况(测试前)
  RabbitMQ 使用情况(测试中)
  这里 发送端和消费端 在一个应用上,共用一条 connection, 发送端创建了 24 个 channel , 消费端 2 个。
  发送端第一条 MQ 数据
  发送端第一条 MQ 数据被 ACK
  从这个监控图可以看到,消费端开始消费的时间点大概是 16:47:00
  而生产者发送第一条消息和被confirm 的时间大概是 16:46:30 ; 这个有误差是因为这个监控自动刷新的频率是 15s ,目前是最小的了(可能是我挑的模板问题,或者是这并发太小)
  消费者消费能力,大概每秒 2 个 ack
  channel
  K8S
  minikube 节点,上面运行了 Redis 主从 , MySQL 主从。
  K8S的情况(测试前)
  K8S的情况(测试后)
  基本没变化。
  后面再把 MQ 和 镜像仓库搭建一下,然后再把项目丢上去跑跑看看 ,到时再看看这个测试报告。
  over!  喜欢的小伙伴记得关注下哦,全网同名

苹果悄然发布新一代iPadiPadPro,全面采用USBC接口北京时间2022年10月19日凌晨,苹果官网悄然上架了两款平板电脑,分别是终于采用USBC的第十代iPad,与升级至M2处理器的iPadPro。iPad第十代作为iPad系列最基础苹果深夜发布新款iPad搭载M2芯片今天凌晨,苹果官网多了几款新品。其中包括iPad10iPadPro202211英寸iPadPro202212。9英寸,下面我们就来一起了解一下。iPad10采用了直角全屏设计,屏幕PlugChain汇集Web3。0世界流量,向全世界的用户开放Web3。0世界随着Web3。0时代的来临,以区块链为代表的分布式技术推动下,从去中心化点对点账本实验到去中心化智能合约平台,催生了无数的新型应用,DeFiGameFi也形成了数字世界里的金融服务苹果iPad10与iPadPro2022发布,前者像iPadAir,后者升级M2芯片昨天晚上,苹果悄悄发布了新款的iPad10以及iPadPro2022。新款的iPad10在外观上看起来更像iPadAir,采用窄边框设计,屏幕为10。9英寸,同时取消了上一代的Ho我们如何看待孩子的边界?边界是什么呢?如果在网上搜索结果,我们会看到一条解释。边界指的是,地区和地区之间的界线。或许可以想象成将复数的不同的事物与空间隔开的一条线。将边界放在人的社交言行身上,似乎很好理解小明邀你读书父母以身作则,孩子为什么还是会有行为偏差?作者赵小明编辑杨丽芸小明语录所以做互联网就是在给别人创造虚妄,而你自己要打破别人给你创造的虚妄。1未来的游戏化思维模式现在很多人都喜欢玩电子游戏,针对儿童的教育有很多改成游戏化设计孩子这么做运动,一个月长高3公分?今天和大家探讨长高个子需要注意的运动问题。你的孩子有每天做运动吗?你有经常带着孩子做户外运动吗?长高的问题并不难,刨除遗传因素之外,运动和睡眠其实是有利于长高的最简单直接的方法。大家里有孩子的,妈妈要学会这五道菜,常做给孩子吃,营养又补钙欢姐美食,爱分享美食。秋天是孩子长高黄金期,妈妈抓住这个时机,给孩子补足营养补足钙,不怕孩子不长个儿。五道菜的做法如下,一起来看看吧,都是简单易做的家常菜。第一道番茄蒸鸡翅食材鸡中不吼不叫做到不吼叫孩子,从保持自己的情绪稳定开始佩玛。丘卓在生命不在这本书中写道让我们欢喜或者悲伤的,不是我们的遭遇,而是我们的心态。让我们痛苦的,是我们对所发生的事情的看法。电视剧虎妈猫爸中,有这样一幕,让人感同身受。赵薇饰演精致又大气的男宝宝名字,胸怀天下,浩气存心大气的名字多见,但在大气的基础上有精致之感的名字可谓难得。今天子墨老师分享给大家如下精致又大气的男宝宝名字,每个名字都是精心设计,既能体现男子广阔的胸襟,又能体现不俗的艺术风格。让吉林女孩到香港当尼姑,与2个和尚结婚,开豪车住别墅,啥结局?2005年10月,一名香港女艺人在发布会上曝光了一件令人大跌眼镜的事情。该女艺人称香港定慧寺的女住持,竟然先后与内地的两名和尚结了婚。尼姑与和尚结婚?这件奇葩之事一经曝光便直接冲上
41!乒乓球再爆冷门14岁小将逆转伊藤美诚,张本智和双喜临门北京时间2022年11月13日,日本乒乓球选拔赛进入最后一个比赛日,女单排位赛爆出冷门,14岁的张本美和在先丢一局的情况下连扳四局,41逆转伊藤美诚,让人大吃一惊。张本美和获得本次木村拓哉50岁生日,俩闺女晒出不老爹,工藤静香含蓄表达爱意当地时间11月13日,木村拓哉在社交媒体上分享了一张生日卡片的照片,感谢人们对她50岁生日的祝福。非常感谢大家的留言!我不知道我能走多远,但我会尽我所能的,年过半百的亚洲之光如此说CBA三消息辽宁天才仍未签约,郭艾伦开启加练,霍华德目标夺冠大家好呀,我是北柠,各位小伙伴们要养成先看后赞的习惯哦!辽宁队这个赛季的表现依旧非常突出,球迷们更加关心的是球队后继力量的问题,现在韩德君和李晓旭的年龄已经很大了,他们都快要迎来退张本14岁妹妹爆冷41击败伊藤美诚!日本乒乓一姐黑脸,连败获第6北京时间11月13日,日本top32强赛女子第五名争夺战,伊藤美诚再次遭遇冷门,14不敌14岁的张本美和,获得第六名。伊藤美诚去年奥运会夺得混双冠军后一路走低,无法再击败中国选手不纳什已经下课了,里弗斯还会远吗?里弗斯什么时候下课?望向76人开季至今5胜7负的战绩,发问的不只有费城球迷,还有当地媒体。早在2020年76人炒掉前任主帅布雷特布朗的时候,已经有人反对由里弗斯成为继任者。原本费城去意已决?穆里尼奥在罗马遇到瓶颈,或逃离罗马,重回老东家导读作为流量最大的主教练,穆里尼奥加盟罗马之后,让罗马队成为最受关注的球队之一。穆里尼奥帮助罗马队赢得欧会杯冠军之后,一心想获得欧冠资格,但是新赛季的罗马被现实击败。事实证明,罗马国际篮联动手,中国男篮晋级被取消,男篮球迷气愤不已在这段时间中国男篮是踏上了世预赛第五期的比赛舞台,而在不久以前,中国男篮也是在首战比赛当中成功地击败了伊朗队,拿下了本次世预赛窗口期的第一场胜利,这场比赛胜利确实给中国男篮打响了一网友称得物调用手机权限删投诉视频得物没动力也没能力删除用户相册,正与手机厂商确认红星资本局消息,11月13日,得物官方微博账号就此前网友称其调用手机权限删投诉视频一事,发布公开声明。随后,话题得物登上微博热搜。据九派新闻报道,11月12日,有网友曝光一段视频,人到了一定年龄,拼的是这四种能力能扛事的能力到了一定年龄,人们常感叹肩上的责任越来越重,遇到的事情越来越多。谁能扛得住生活的刁难,谁就是生活的胜利者。做一个能扛事儿的人,首先是遇事不乱,不随便发脾气。情绪失控解决江特电机业绩创新高,盈利能力再上新台阶,研发力度持续加大!锂盐新项目获多方加持过去两年来,新能源赛道持续高景气,在下游新能源车储能等行业需求带动下,A股锂电池板块上市公司股价表现强势,江特电机便是其中之一。证券时报数据宝统计,金属锂行业上市公司中,过去两年来改朝换代!美媒评选新赛季表现最好的五位球员,詹杜库统统落选本赛季开始至今,每支球队都至少已经打了十多场比赛,今天就有美媒评选出了目前表现最好的五位球星,下面让我们来具体了解一下。TOP5贾莫兰特今天NBA两大名嘴比尔西蒙斯跟斯蒂芬A史密斯