京东面试官问哭的秒杀系统考点服务器redis调用队列

综上所述,可以总结出秒杀系统场景的几个特点:

秒杀一般是访问请求数量远远大于库存数量,只有少部分用户能够秒杀成功。

01

秒杀架构设计

限流:鉴于只有少部分用户能够秒杀成功,所以要限制大部分流量,只允许少部分流量进入服务后端。

异步处理:秒杀系统是一个高并发系统,采用异步处理模式可以极大地提高系统并发量,其实异步处理就是削峰的一种实现方式。

内存缓存:秒杀系统最大的瓶颈一般都是数据库读写,由于数据库读写属于磁盘IO,性能很低,如果能够把部分数据或业务逻辑转移到内存缓存,效率会有极大地提升。

可拓展:当然如果我们想支持更多用户,更大的并发,最好就将系统设计成弹性可拓展的,如果流量来了,拓展机器就好了。像淘宝、京东等双十一活动时会增加大量机器应对交易高峰。

02

架构原则

争取做到4要1不要

2.请求数要尽量少:用户请求的页面返回后,浏览器渲染页面还包含其他的额外请求,比如说这个页面依赖的CSS/Javascript,图片以及Ajax请求等,这些额外请求应该尽量少。因为浏览器每发出一个请求都多少会有一些消耗,例如建立连接要做三次握手,另外不同请求访问的域名不一样,还需要做DNS域名解析,可能会耗时更久。

3.路径要尽量短:所谓“路径”,就是用户发出请求到返回数据这个过程中,需求经过的中间的节点数。

4.依赖要尽量少:所谓依赖,指的是要完成一次用户请求必须依赖的系统或者服务,这里的依赖指的是强依赖。

5.不要有单点:系统中的单点可以说是系统架构上的一个大忌,因为单点意味着没有备份,风险不可控,我们设计分布式系统最重要的原则就是“消除单点”。

03

流量削峰

排队:要对流量进行削峰,最容易想到的解决方案就是用消息队列来缓冲瞬时流量,把同步的直接调用转换成异步的间接推送,中间通过一个队列在一端承接瞬时的流量洪峰,在另一端平滑地将消息推送出去。在这里,消息队列就像“水库”一样,拦蓄上游的洪水,削减进入下游河道的洪峰流量,从而达到减免洪水灾害的目的。

答题:防止用户作弊,延缓用户请求。

分层过滤:分层校验的目的是:在读系统中,尽量减少由于一致性校验带来的系统瓶颈,但是尽量将不影响性能的检查条件提前,如用户是否具有秒杀资格、商品状态是否正常、用户答题是否正确、秒杀是否已经结束、是否非法请求、营销等价物是否充足等;在写数据系统中,主要对写的数据(如“库存”)做一致性检查,最后在数据库层保证数据的最终准确性(如“库存”不能减为负数)。

04

异步处理

我们大家想一想,即使我们做了上面的限流机制,卡住了绝大部分请求到业务系统中,但还是有很多请求进入了业务系统。如果我们商品库存数为5000个库存,在大流量的时候,会有很多用户都有资格去下单,那也就是同时会有5000个并发去操作mysql数据库。那数据库也是抗不住的,一般mysql的并发量500左右。

这个时候我们需要做一些异步处理,让5000个下单请求进入消息队列,让订单消费服务去慢慢处理5000个请求,这样就有效的把并发同步请求,改为了串行异步。

当然改成了异步处理,前端在下单的时候,就没法立刻得到下单的结果,所以前端要做一个【抢购中。。。】的状态页面,在此页面中定时轮询下单结果。这样就大大提升了系统的吞吐量,降低了系统压力。

消息队列中间件有很多选择,一般选择RabbitMq,RocketMq。

05

多级缓存

使用场景:所有商品库存全部依赖数据,在高并发情况下,数据库死翘翘了...

秒杀商品一个用户只能抢购一次,一次只能抢购一个!

一级缓存:在程序启动完成后,将商品信息存入redis中

二级缓存:ConcurrentHashMap内记录商品是否售完标识;

大概思路:程序启动加载init代码块,将商品库存信息放入redis中,下单时直接使用redisdecr;如果stock小于0,记录jvm缓存中商品售完标识;启动zk监听,同步多个jvm内存标识;

坑坑坑点:redis原子减会减成负数,如果有下单失败退单等操作,负数+1还是负数,然鹅是有库存的!所以redis库存一定要还原或者改成0

商品信息加入redis中:

@PostConstruct

publicvoidinit()throwsException{

ProductproductParam=newProduct();

productParam.setSpecial(ProductType.PRODUCT_MIAOSHA);

ListmiaoshaProducts=productService.selectList(productParam);

for(Productproduct:miaoshaProducts){

RedisUtil.set(RedisKeyPrefix.PRODUCT_STOCK+"_"+product.getId(),String.valueOf(product.getStock()));

}

减少库存zk监听:

Longstock=RedisUtil.decr(RedisKeyPrefix.PRODUCT_STOCK+"_"+productId);

if(stock==null){

returnReturnMessage.error("商品数据还未准备好");

if(stock<0){

RedisUtil.incr(RedisKeyPrefix.PRODUCT_STOCK+"_"+productId);

productSoldOutMap.put(productId,true);

//写zk的商品售完标记true

//判断父节点是否存在

if(zooKeeper.exists(ZookeeperPathPrefix.PRODUCT_SOLD_OUT,false)==null){

//创建父节点

zooKeeper.create(ZookeeperPathPrefix.PRODUCT_SOLD_OUT,"".getBytes(),Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);

//判断节点内商品信息是否存在

if(zooKeeper.exists(ZookeeperPathPrefix.getZKSoldOutProductPath(productId),true)==null){

//创建商品子节点

zooKeeper.create(ZookeeperPathPrefix.getZKSoldOutProductPath(productId),"true".getBytes(),Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);

if("false".equals(newString(zooKeeper.getData(ZookeeperPathPrefix.getZKSoldOutProductPath(productId),true,newStat())))){

zooKeeper.setData(ZookeeperPathPrefix.getZKSoldOutProductPath(productId),"true".getBytes(),-1);

//监听zk售完标记节点

zooKeeper.exists(ZookeeperPathPrefix.getZKSoldOutProductPath(productId),true);

returnReturnMessage.error("商品已抢完");

"zooKeeperWatcher">

"zookeeperAddr"value="${zk.ip}"/>

"zookeeper"lazy-init="true">

"connectString"value="${zk.ip}"/>

"sessionTimeout"value="5000"/>

"watcher"ref="zooKeeperWatcher"/>

/**

*zk更新缓存watcher

*/

publicclassZooKeeperWatcherimplementsWatcher{

privatestaticfinalLoggerlogger=LoggerFactory.getLogger(ZooKeeperWatcher.class);

privateZooKeeperzooKeeper;

publicZooKeeperWatcher(StringzookeeperAddr)throwsIOException{

super();

this.zooKeeper=newZooKeeper(zookeeperAddr,500,null);

@Override

publicvoidprocess(WatchedEventevent){

if(event.getType()==EventType.NodeDataChanged){//zk目录节点数据变化通知事件

try{

Stringpath=event.getPath();///product_sold_out/10270

StringsoldOutFlag=newString(zooKeeper.getData(path,true,newStat()));

logger.info("zookeeper数据节点修改变动,path={},value={}",path,soldOutFlag);

if("false".equals(soldOutFlag)){

StringproductId=path.substring(path.lastIndexOf("/")+1,path.length());

MiaoshaAction.getProductSoldOutMap().remove(productId);

}catch(Exceptione){

logger.error("zookeeper数据节点修改回调事件异常",e);

06

其他问题

服务单一职责:设计个能抗住高并发的系统,我觉得还是得单一职责。

什么意思呢,大家都知道现在设计都是微服务的设计思想,然后再用分布式的部署方式

单独给他建立一个数据库,现在的互联网架构部署都是分库的,一样的就是订单服务对应订单库,秒杀我们也给他建立自己的秒杀库。

至于表就看大家怎么设计了,该设置索引的地方还是要设置索引的,建完后记得用explain看看SQL的执行计划。(不了解的小伙伴也没事,MySQL章节我会说的)

单一职责的好处就是就算秒杀没抗住,秒杀库崩了,服务挂了,也不会影响到其他的服务。(强行高可用)

Redis集群:秒杀本来就是读多写少,那你们是不是瞬间想起来我之前跟你们提到过的,Redis集群,主从同步、读写分离,我们还搞点哨兵,开启持久化直接无敌高可用!

资源静态化:秒杀一般都是特定的商品还有页面模板,现在一般都是前后端分离的,所以页面一般都是不会经过后端的,但是前端也要自己的服务器啊,那就把能提前放入cdn服务器的东西都放进去,反正把所有能提升效率的步骤都做一下,减少真正秒杀时候服务器的压力。

秒杀系统的特点就是千万不要卖超,限量卖!如果买超了老板那里可能就不好交代了,这是前提。

例如,我们平常购物都是这样,看到喜欢的商品然后下单,但并不是每个下单请求你都最后付款了。你说系统是用户下单了就算这个商品卖出去了,还是等到用户真正付款了才算卖出了呢?这的确是个问题!

THE END
1.北京京东降有限公司招聘怎么样?京东健康-营养保健-营养师服务运营岗-I0294S20k-30k · 16薪 北京本科及以上3-5年营养师 发展空间大 工作内容: 1. 负责营养师咨询的线上运营工作; 2. 从用户体验、业务目标出发,组织供给,通过多种运营策略和手段调动机构/营养师/医生等不同角色的积极性,满足用户对于及时性、专业性的需求; 3. 建设和优化服https://maimai.cn/brand/home/FSWtqcH3
2.京东在线咨询重塑电商服务体验医疗服务随着互联网的普及和电子商务的飞速发展,消费者对于购物体验的需求日益提升,在这一背景下,京东作为一家领先的电商平台,始终致力于为消费者提供更加便捷、高效的购物体验,京东在线咨询作为京东服务的重要组成部分,已经成为消费者与商家沟通的重要桥梁,为消费者提供全方位的购物咨询和服务支持。 http://app.xinggumg.com/post/18889.html
3.最近在做京东医生仁心仁术Y 普通内科医师 有单吗?2 天前来自AndroidIP湖北湖北 收藏回复点赞 笑面虎医生:有2元的 https://www.dxy.cn/bbs/newweb/pc/post/51250532
4.京东降上的医生靠谱吗?是什么商业模式?(京东降上的医生)在京东上买药有时候是需要医生在线问诊的,只有你提供一些证据的情况下才可能给你开药的,而且当你不知道购买什么药物的时候也可以咨询京东健康上的医生,那么这些医生靠谱吗? 京东健康上的医生靠谱吗? 靠谱。 京东健康是一家互联网医疗平台,为用户提供在线问诊、药品购买、体检预约等服务。在这个平台上的医生都经过严格http://www.77242.cn/news/show-40799.html
5.www.tjxuansheng.com/yyys74706757.shtml女生和男生差三十分软件 人妻性服务150p国模 啊流水了大肉帮插我视频 婉儿别闹百度网盘免费下载资源 料阴如何下载 男人插女人欧美 真人BBwBBwBBwBBw 天天干天天干天天日 久久入 真人啪 91办公室丝袜高跟鞋系列 塞着玩具坐公交车找不到遥控器 三年片最新电影免费观看 国产一二三路线 亚洲最大无码AV一区二http://www.tjxuansheng.com/yyys74706757.shtml
6.www.jxmzxx.com{$woaini}>www.jxmzxx.com{$woaini}{20.全面构建亲清政商关系,支持各地区探索以不同方式服务民营企业,充分利用全国一体化政务服务平台等数字化手段提升惠企政策和服务效能,多措并举帮助民营企业解决问题困难。(责任单位:全国工商联、国家发展改革委)、.. 提升获得感是活跃资本市场的基础 http://www.jxmzxx.com/appnews/668449.html
7.京东大药房618京东大药房的药靠谱吗于提高患者用药依从性,该药的上市填补了中重度特应性皮炎未被满足的需求,期待希必可?给患者带来新的获益此次希必可?上线,将与克立硼罗软膏以更丰富的皮肤科产品组合,在线上全程覆盖轻、中、重度特应性皮炎治疗需求;基于此,京东健康也将携手辉瑞为国内特应性皮炎患者,带来一站式全程管理的服务新体验..https://www.chinaz.com/tags/jingdongdayaofang618.shtml
8.京东云选优品专区百亿补贴靠谱吗?阿里云服务器购买返钱阿里云服务器购买返钱 京东云选优品专区百亿补贴靠谱吗? 京东云选优品专区的百亿补贴是京东云主办的活动,旨在为用户提供云产品选择和购买的优质体验。活动期间,用户可以享受多种优惠政策,如新用户注册返现、折扣优惠、满减等。 (图片来源网络,侵删) 从用户反馈和京东云公司的信誉度来看,该活动是比较靠谱的,很多用户https://www.shiwaiyun.com/article/post/90792.html
9.京东海外购要提供身份证还有银行卡号靠谱吗京东海外购要提供身份证还有银行卡号靠谱。根据查询相关信息显示京东海外购购物平台有营业执照,正常营业,营业环境不错,是按营业执照正规经营,没有涉及违法犯罪,提供身份证还有银行卡号是为了进行实名认证,无需担心,所以京东海外购要提供身份证还有银行卡号靠谱。京东国际是京东集团旗下所属品牌,主营跨境进口商品业务,前身https://wenda.so.com/q/1680816380218972
10.抠门的京东,凭什么扛春晚?2021年“618购物节”那天,京东的活跃用户数粗略估算在1亿左右,也就是说,春晚大概是6个“618”那么多。 但讲真,这个时候,常亮心里还是有底的。 红包都发了六年了,别人家公司能扛得,我京东肯定能扛得。 况且他已经问了一圈,别的公司决定赞助春晚之后,负责基础资源这群人做的第一件事儿就是——买服务器。(https://www.qianhei.net/yinmiwangshi/360.html
11.2018福布斯最具创新力企业福布斯50家中国最具创新力企业全榜单→买《福布斯中国》发布了2018年中国50家最具创新力企业全榜单,涉及AI服务商、云计算、区块链、金融科技等12大领域,榜单选取出每个领域中富有创新力并持续成长的企业,其中小红书、网易云音乐、爱奇艺、腾讯动漫、平安好医生等企业成功登榜。 2018福布斯50家中国最具创新力企业上榜名单一览 https://www.maigoo.com/news/503969.html
12.8点1氪丨?预计国庆中秋机票价格超暑期;医生称极少贪腐无法代表据报道,鸿海集团首度拿下英伟达HGX服务器AI芯片基板大单,供货比重超过五成,加上此前已获得该公司另一款DGX服务器AI芯片基板订单,现阶段英伟达最重要的两款AI服务器基板订单,鸿海集团均有份,且供应比重逐步放大。(界面新闻) 德勤日本公司最快下月起利用AI审查企业财务信息 https://36kr.com/p/2388558697969927
13.服务器电源怎么样服务器电源多少钱为您提供服务器电源评价排行榜,服务器电源价格、图片、哪款好等信息 首席玩家(1st player)额定600W 黑寡妇600全模组 电源(80PLUS铜牌/全模组/双CPU接口)暂无报价 评价人数1万+好评度99% 夏目友人帐的猫老师 这种扁平线感觉挺靠谱的,238元600瓦还是铜牌,京东自营质保三年,也不担心售后问题了。用来带2600X+RX580https://club.jd.com/koubei/e69c8de58aa1e599a8e794b5e6ba90.html
14.web.hzaqdq.com/nodenews/550002.shtmlpixiv破解教程_城市观察员 www.17cwww.com的服务器ip 在哪里可以免费看黄片 午夜看黄片免费 黄色A级片免费 污视频168.206.138.212.com 操逼黄片下载 茄子视频app下载安装免费无限看-丝瓜苏州晶体公司藏族 国产伦子老太婆 爱情岛资料大全 国产又粗又猛又爽又黄的免费摄影 欧美综合亚洲图片综合 青青草成人电影http://web.hzaqdq.com/nodenews/550002.shtml
15.微信小程序定制开发专业的微信小程序定制公司能够提供从策划、设计到开发、维护的一站式服务,确保项目顺利上线并持续优化。https://www.seohnzz.com/
16.回收需求评估与合同签订评估需求:首先,企业需要评估其旧服务器的数量、型号、配置及当前状态。选择回收公司:选择一个有资质的回收公司,并对其资质、信誉、处理能力进行验证。签订合同:与回收公司签订正式合同,明确回收的 回收 个人数据资产变现是场骗局 2024-10-29 “在哪里确权啊?我也想去做一下”“我已经拿到第https://www.mul-e.com/nr.jsp?groupId=29
17.渭城区人民政府坚决落实党中央、国务院、省、市关于就业工作的各项决策部署,深化拓展“三个年”活动成果,以“人社工作进园区”为总牵引,扎实做好春节后劳动者换岗流动高峰期和企业复工复产关键期就业工作,全力以赴稳就业、多元施策保用工、凝心聚力促发展,渭城区特举办2024年“春风送岗促就业 精准服务助发展”春风行动线上招聘会https://www.weic.gov.cn/xw/tzgg/202403/t20240321_1745150.html