首页
题库
公司真题
专项练习
面试题库
在线编程
面试
面试经验
AI 模拟面试
简历
求职
学习
基础学习课
实战项目课
求职辅导课
专栏&文章
竞赛
搜索
我要招人
发布职位
发布职位、邀约牛人
更多企业解决方案
AI面试、笔试、校招、雇品
HR免费试用AI面试
最新面试提效必备
登录
/
注册
王茆茆
浙江大学 Java
发布于浙江
关注
已关注
取消关注
@需要努力的97:
秒杀项目常见问题
1.讲一下你这个高并发抢购系统(秒杀) 是什么,用了什么(Redis、动静分离、隐藏链接、限流、削峰),压测结果 这个系统主要是模拟秒杀活动,实现一个支持高并发的服务。 为了解决高并发带来的问题,我用Redis实现了缓存预热、预减库存的功能,通过使用Nginx实现动静分离来降低服务器的压力,加快用户访问速度。隐藏了秒杀接口地址,防止用户提前知道秒杀地址。还通过输入验证码的方式防止恶意秒杀,同时还起到了削峰的作用。最后通过Jmeter压力测试,QPS从最初的150/s提升到2000/s左右。 2.秒杀中如何处理超卖问题? 在定时上架秒杀商品时,使用分布式信号量作为商品的库存缓存到Redis中,当活动开始接收到秒杀请求时,在Redis中进行预减库存,如果Redis中的库存不足时,直接返回秒杀失败;如果有库存,就将请求放入异步队列中,给用户返回一个秒杀成功,正在创建订单,然后订单服务监听这个队列,生成秒杀订单,减少数据库库存等一系列操作。 3.秒杀中如何解决重复下单问题?(普通订单也一样操作) mysql唯一索引(商品索引)+ 分布式锁 4.热点数据失效(缓存击穿)问题如何解决? 因为每一场的秒杀活动持续的时间都是确定的嘛,所以可以把热点数据的过期时间设置的跟活动持续时间一样,这样活动一结束,热点数据自己就删除了,也不会导致在活动期间数据就失效了。 5.Redis缓存和数据库数据一致性如何保证? 使用canal组件实现(canal的原理,模拟MySQL的主从复制机制) 更新数据库后立即删缓存,然后下一次查缓存找不到数据后会再次从数据库同步到缓存。 6.★减库存成功了,但是生成订单失败了,该怎么办?(分布式事务的数据一致性问题) 使用mq来解决这个问题。如果扣减库存成功了但是下单失败了,订单服务就给mq发送一个消息,然后库存服务就来监听这个mq,如果能从mq中拿到消息说明订单失败了,然后就进行回滚操作。 【tips】seata虽然能控制分布式事务,但是不适合高并发,像下订单就是一个高并发操作,所以我们不用seata来实现下订单的分布式事务。因为seata实现分布式事务需要加锁,一加锁相当于把高并发变成串行化了。 7.做了什么限流削峰的措施? (1)点击秒杀按钮以后要先填一个验证码(前端); (2)在定时上架秒杀商品时,使用分布式信号量作为商品的库存缓存到Redis中,当活动开始接收到秒杀请求时,在Redis中进行预减库存,如果Redis中的库存不足时,直接返回秒杀失败; 8.如何解决客户的恶意下单问题? 如果客户想伪造请求来快速秒杀,通过我们的链接加密可以实现。 使用脚本的恶意请求可以用验证码来解决。 9.多机器扣减库存,如何保证它的线程安全的? 用redission实现分布式锁。在扣减库存前,先获取分布式锁getLock(),然后上锁lock,再进行扣减,最后再释放锁。 (1)如果扣减失败,没有释放锁会导致什么情况?怎么解决? 会造成死锁。 给锁设置过期时间,防止出意外释放不了锁造成死锁。 (2)怎么保证释放的就是自己的锁? 在getLock时可以给锁一个名字,只要名字一样就是同一把锁。 10.如何去减Redis中的库存? 在秒杀系统中Redis中的商品库存是用分布式信号量存的,通过tryAcquire()来获取信号量,获取信号量的操作就相当于扣减了库存。 【tips】tryAcquire()是不阻塞的,tryAcquire()不传参是获取一个信号量,tryAcquire(int n)是获取n个信号量(有这么多的话)。 11.缓存中的数据突然失效,导致请求全部打到了数据库,如何解决? (典型的缓存雪崩问题) 给缓存中的数据的过期时间加随机数。 12.如果项目中的Redis挂掉,如何减轻数据库的压力? 可以搭建redis集群,通过哨兵机制来监控主节点,如果主节点挂了就从从节点中选一个新的主节点,实现故障转移。 13.页面静态化 那就把能提前放入cdn服务器的东西都放进去,反正把所有能提升效率的步骤都做一下,减少真正秒杀时候服务器的压力。 14.秒杀系统面临的问题有哪些? 高并发、脚本恶意请求、加了缓存之后的缓存三大问题(击穿、穿透、雪崩)。 15.秒杀系统如何设计? 独立部署+动静分离+限流+熔断降级+缓存预热+异步订单+秒杀链接加密。 (1)独立部署 把秒杀系统单独作为一个微服务,这样一旦秒杀系统实在顶不住了,也不会影响其他服务。 (2)动静分离 使用Nginx实现动静分离,让静态资源从nginx直接返回,减轻服务器的压力。 (3)限流 前端限流+后端限流。 前端可以使用一个验证码,通过手速快慢可以进行一部分限流,还可以过滤机器人的恶意请求。 后端可以使用sentinel在网关设置一些限流规则,比如url必须正确;还可以用分布式信号量,在Redis中保存用分布式信号量代替库存,抢不到信号量就不用去查数据库了。 (4)熔断降级 如果出现问题,给前端返回一个快速失败的提示,将用户引导到一个降级页面,这样可以保证整个调用链不是阻塞的。 (5)缓存预热 使用定时任务在每天凌晨三点上架要秒杀的商品,将商品信息提前保存到Redis中。 (6)异步订单 秒杀成功后发送消息给mq然后给用户返回"秒杀成功,正在创建订单",让订单服务监听mq,然后异步进行订单创建、扣减库存等操作,这样可以防止一条秒杀请求阻塞等待订单完成才给用户返回结果。 (7)秒杀链接加密 缓存商品数据时给每个商品随机生成一个uuid,在发送秒杀请求时,必须保证请求带上skuId和这个随机码才能进来。 16.分布式会话问题? 在实现用户社交登录时,发现有时候已经登录过了但是系统还是会提示去登录,后来发现是session和cookie的问题,这个问题其实是在分布式下session不能共享的问题。用户第一次登录时把登录信息放在session里(session.setAttribute("sessionName",value)),然后把session保存在服务器里,并把token返回给浏览器的cookie,这样用户第二次请求时就带着有token的cookie,服务器就认为已经登陆过了。但是在分布式下会存在一些问题,首先这个过程只能在当前域名下(同一微服务)起作用,其次如果有多台服务器的话,两次请求转发到不同的服务器,即使是同一服务也不能共享session数据。 解决方案是通过SpringSession,自定义一个cookie的序列化器,先将作用域扩大到整个项目(setDomainName())。同时在用户第一次登录时,将session都存到Redis里,让所有服务都去Redis里根据sessionId去获取对应的session, 然后通过设置cookie跨域分享以及利用redis存储token信息得以解决。 17.线程池的执行过程? 当任务进来后,会先判断线程池中的核心线程数是否小于corePoolSize,如果小于的话会直接创建一个核心线程去处理任务;如果大于说明没有核心线程了,就将任务放入阻塞队列中等待。如果核心线程和阻塞队列都满了,就创建非核心线程,去处理阻塞队列中的任务。当线程数达到了maximumPoolSize并且阻塞队列也满了,就会采用拒绝策略来处理任务。 18.你项目中的难点是什么? (1)Feign远程调用丢失请求头问题 在进行远程调用时cookie需要带上sessionId,来标注用户登录状态的session,但是发现还是提示要先登录,而且cookie中并没有sessionId。后来查了资料发现feign在远程调用时会先构造一个新的请求,而这个新请求里面并没有请求头,所以导致没有携带sessionId。 解决:feign在构造请求之前可以经过请求拦截器(RequestInterceptor),通过拦截器的apply方法可以给请求加一些东西,但是默认情况下是没有拦截器的,那么我们就可以自己定义一个RequestIterceptor并重写apply方法,通过RequestContextHolder来获取原来请求中的sessionId,然后让后面feign构造的新请求携带上sessionId。 (2)用户登录的问题(分布式session) 在实现用户社交登录时,发现有时候已经登录过了但是系统还是会提示去登录,后来发现是session和cookie的问题。用户第一次登录时把登录信息放在session里(session.setAttribute("sessionName",value)),然后把session保存在服务器里,并把token返回给浏览器的cookie,这样用户第二次请求时就带着有token的cookie,服务器就认为已经登陆过了。但是在分布式下会存在一些问题,首先这个过程只能在当前域名下(同一微服务)起作用,其次如果有多台服务器的话,两次请求转发到不同的服务器,即使是同一服务也不能共享session数据。 解决方案是通过SpringSession,自定义一个cookie的序列化器,先将作用域扩大到整个项目(setDomainName())。同时在用户第一次登录时,将session都存到Redis里,让所有服务都去Redis里根据sessionId去获取对应的session。 19.项目中Redis都做了些什么? (1)在项目中用Redis保存购物车数据; (2)通过令牌机制实现接口的幂等性,将token保存在Redis中; (3)在实现社交登录时,将session存在Redis中来解决session共享问题; (4)在实现秒杀时,将秒杀商品信息缓存到Redis中。 20.项目中RabbitMQ都做了什么? 作为异步下单的中间件,实现解锁库存和定时关单。 (1)解锁库存 (超时未支付、用户自己取消订单、锁完库存但是其他远程调用失败了导致的订单回滚都要解锁库存) 当需要解锁库存的时候,比如说订单回滚了,就给交换机发送一个消息,然后交换机根据路由键转发给解锁mq,库存解锁服务监听到这个消息以后,就根据消息进行库存解锁的操作。——可以涉及到方法重载 【库存工作单表】记录了库存锁了多少,是哪个订单锁的,方便回滚。 (2)定时关单 当订单创建成功了,就给交换机发送(rabbitTemplate.convertAndSend())一个消息(订单实体对象),然后交换机根据路由键将消息转发到延迟队列,延迟队列设置了30min的过期时间,当30分钟一过,延迟队列会把过期的消息,再发给交换机,由交换机转发给关单的消息队列,由关单服务进行监听,关单服务拿到消息以后要先判断订单状态,如果是待支付状态,就进行关单,把订单状态设置为已取消;如果是其他状态就不用操作了。 21.线程池技术中核心线程数的取值有经验值吗? CPU密集型业务:N+1 IO密集型业务:2N 22.TPS(每秒处理的事务)提升了多少?如何提高tps? 基础架构下的tps是200,经过做动静分离、引入redis缓存、nginx反向代理(集群)后达到了2000左右。 23.一个人同时用电脑和手机去抢购商品,会颁发几个token? (多台设备登录属于SSO问题,用户登录一端之后另外一端可以通过扫码等形式登录。) 虽然用户登录了多台设备,但是用户名是一样的,所以为用户颁发的token是相同的,只会颁发一个token。 24.线程池的拒绝策略能详细说一下吗? AbortPolicy:直接丢弃任务,并抛出RejectedExecutionException拒绝执行异常; DiscardPolicy:丢弃(discard)任务,但是不抛出异常; DiscardOldestPolicy:丢弃位于阻塞队列最前面的任务(也就是最早进来的任务),然后重新提交被拒绝的任务; CallerRunsPolicy:由提交任务的线程处理该任务。 25.被线程池拒绝掉的那部分用户的秒杀令牌还有效吗? 无效,会从redis中删除,当该用户再去秒杀抢购时,需要重新获取秒杀令牌。 26.线程池中阻塞队列的大小设置为多少合适? 设置为(秒杀商品的个数 - 核心线程数)。这样的话所有秒杀任务最终都可以被处理,而不会说明明有库存,用户秒杀了但是队列满了导致秒杀任务被丢失了。 27.项目上线之后想看JVM的GC情况在Linux中用什么命令? jstat -gc vmid count // jstat-统计jvm信息的指令 jstat -gc 12538 5000 // 表示将12538进程对应的Java进程的GC情况,每5秒打印一次 29.能不能详细描述一下使用MQ异步减redis与MySQL库存的过程? redis中的库存减成功后,生成一条消息,包含了商品信息(包含了库存信息)和用户信息,然后将消息发送给交换机;交换机转发到生成订单服务监听的队列,然后该服务会消费这条消息,根据商品信息和用户信息创建一条订单,并修改数据库中对应商品的库存。 30.做到了什么程度、库存量与并发度是多少? QPS:单机2000/s 31.秒杀系统中MySQL中的表是怎么设计的? 秒杀用户表、商品信息表、秒杀商品表(记录该商品的秒杀始末时间,秒杀价和剩余量)、秒杀订单表(记录了秒杀用户名和秒杀的商品还有订单号)、订单详情表(通过秒杀订单号来查找对应的订单详情,里面记载更详实的业务信息)。 32.如何只使用MySQL保证商品没有超卖? 将查库存、减库存两个sql语句作为一个事务进行控制,保证每一个库存只能被一个用户消费。两条语句都执行成功进行事务提交,否则回滚。 缺点:低并发。 33.数据库改库存的SQL? update table set stock = stock-1 where sku_id = ? and stock > 1; 34.如何防止用户一直点击下单按钮?(防止重复下单、幂等性问题) 前端限制:一次点击之后按钮置灰几秒钟。 后端限制:由于秒杀令牌的设置,用户的一个下单请求会先判断用户当前是否已经持有令牌了,因为用户全局只能获取一次令牌,然后存入到Redis缓存中。用户有令牌的话直接返回 “正在抢购中”。 35.定时任务的框架选型?为什么选Quartz? 我了解的实现定时任务的方法有Java自带的,比如Timer和ScheduledExecutor,还有Quartz,我在项目中用的就是Quartz。 Timer是通过创建一个TimerTask,实现自己的run方法,然后通过Timer调用schedule方法来调度这个任务,可以指定延迟一段时间后再调度。Timer的缺点就是所有的任务都是用一个线程来调度的,也就是说这些任务是串行执行,不适合用在分布式中。 ScheduledExecutor是基于线程池设计的,每一个调度的任务都由线程池中的一个线程去执行,所以说这些任务时并发执行的。但是ScheduledExecutor只能实现基于开始时间与重复间隔定时任务,像设置每天3点执行一个任务就实现不了了,所以也不满足我的需求。 Quartz支持分布式调度任务,可以通过Cron表达式来实现更复杂的定时任务。怎么使用Quartz? 使用异步执行定时任务,来保证定时任务不阻塞。默认是阻塞的,需要等待上一次任务执行完才能执行下一个。因为默认情况下,定时任务线程池只设置了一个线程。首先要在配置类上@EnableSchedule开启定时任务功能,用@EnableAsync开启异步。然后创建一个调度类,在里面调用定时上架商品的业务逻辑(service),在方法的上面用@Scheduled注解标注每天3点的cron表达式。 36.定时上架商品的流程? 一到我们指定的时间,会先远程调用优惠服务,查出最近三天的秒杀活动(select * from 秒杀活动表 where starttime between xxx and xxx;),如果能查到最近三天的秒杀活动,再查活动关联的秒杀商品信息。然后把活动场次和商品信息缓存到Redis,同时用分布式信号量作为库存进行扣减,只要有一个秒杀请求进来信号量就减1,减到0就说明没库存了。 活动场次用起止时间作为key,关联的skuId作为value,这个value用list存; 商品信息用hash存,hash的key用skuId,剩下的商品信息就是hash的value。 分布式信号量要用Redisson的getSemaphore()方法获取,相当于创建了一个信号量对象,然后通过trySetPermits(库存数量)来设置有几个信号量也就是有多少库存。 37.如何进行秒杀链接加密? 在缓存商品信息时,给每个sku设置一个uuid随机码,这样即使有人知道要秒杀商品的id,也无法提前写好请求地址进行恶意秒杀。
点赞 33
评论 4
全部评论
推荐
最新
楼层
暂无评论,快来抢首评~
相关推荐
昨天 22:22
已编辑
腾讯_pcg_后台开发(实习员工)
字节实习飞书二面
自我介绍算法。合并区间,lc56八股+场景GoGo的标准库用过哪些?gmp说一说计网输入URL到渲染内容发生了什么DNS 的迭代和递归查询一个页面渲染慢了,怎么定位问题?数据库索引类型两个事务同时执行一条记录的先查询,内存中更新,然后回写,最终的结果有几种可能,具体数值是:原始2000,操作是+500实习项目反问:面试表现,由于那边偏传统工程,所以对实习项目(偏Agent一些,传统工程也有)问的较少,说可能是传统工程做的少了,有一些基础不扎实hc,很明确的有,但人很多。毕竟飞书是很大的团队,即使是一个组也很多人竞争hc
查看9道真题和解析
点赞
评论
收藏
分享
昨天 08:36
蚌埠坦克学院 嵌入式软件开发
影石 嵌入式 二面面经 被拷打了
前言二面整体难度明显高于一面,问题从“你做过什么”升级为“你为什么这样设计”“如果量产会遇到什么问题”。不再停留在模块级别,而是围绕整机系统架构、视频处理链路、性能瓶颈、异常场景和可靠性设计展开深挖。面试官更关注:是否真正理解影像系统的数据流是否具备系统级架构思维是否有产品化与量产经验是否能从性能、功耗、热、稳定性多维度思考问题整体感觉:如果没有完整做过影像类产品,或者没有系统级复盘,很容易被连续追问带走节奏。详细介绍你做过的影像项目整体技术架构,你负责的模块是什么?数据流如何设计?如果让你从零设计一款运动相机的软件架构,如何分层?模块如何解耦?运动相机防抖有哪些实现方式?EIS 和 OIS ...
查看16道真题和解析
点赞
评论
收藏
分享
02-09 15:47
重庆理工大学 Java
求指点
怎么改啊啊啊啊啊啊啊啊
烤点老白薯:
亲娘嘞🐶💩啊你的简历
点赞
评论
收藏
分享
02-02 16:43
中山大学 产品运营
春招到现在一个面邀都没有,我不知道该怎么办
lz大四,在校期间一直不知道要去公司找实习,一直到大四才意识到重要性。于是一边秋招,一边找实习,最后秋招失败了,找了一个互联网公司的实习,干到了现在。我原本以为靠着这个实习经历能在春招至少比春招好一些,但直到现在,投出去的岗位虽然多,收到的面邀却一个也没有。字节的投递一直在评估中,快手简历挂了两次,其他的也一直没有回信。不知道我接下来该怎么办,我应该升学吗?•我即使读了研毕业,以我的专业,就业压力一点也不会减小•我转了码,作为半路出家的我,也打不过科班出身的人吗我应该延毕刷一年实习吗?•但延了毕就像坐过牢一样,谁都会问一嘴怎么回事我应该去国外升学,试着在擅长的日本就业吗?•但我是外国人,外国人本身在日本就饱受歧视,我作为外国人去了也很难找到工作吧
匿名小透明:
不必焦虑 你这条件强过很多人了
点赞
评论
收藏
分享
昨天 22:08
电子科技大学 后端工程师
阿术从上学到大厂上班的经历
大家好,我是阿术。这篇分享下我读书、找工作经历,有问题都可以向我提问哦。1. 自我介绍电子科大本硕,本科综合排名前5%,拿到中科大、东南和本校的保研offer硕士两篇一作 C 会拿到阿里云、蚂蚁暑期实习offer,选择在蚂蚁实习并转正校招拿到 10+ offer,其中大厂有腾讯、蚂蚁、百度、美团、阿里云,国企有工行、交行、建行、招行、人保、14所,目前在大厂当程序员2. 读书2.1 本科我是从河南小县城考到电子科大的,本科时候成绩也不错,比较会考试,很多成绩都是90+,年级排名大概是5%左右。由于学校风气就是深造,自己也没有对职业发展做规划,所以就只知道本科毕业读研读博。我们学校的保研率是在1...
开工第一帖
点赞
评论
收藏
分享
评论
点赞成功,聊一聊 >
点赞
收藏
分享
评论
提到的真题
返回内容
全站热榜
更多
1
...
面试官视角聊聊:秋招AI岗高频面试问题
1.1W
2
...
暑期实习 字节三面(1h26min,纯纯拷打,没有算法题!)
3791
3
...
字节剪映后端一面凉经😭
3458
4
...
24届三本,广州跳槽至上海后惨遭裁员,这是我的现状
3222
5
...
哈啰后端一面
2941
6
...
实习中找暑期实习的几个问题
2428
7
...
从荆棘到向阳,再到被丢进人才库:一个普通人的大厂梦碎实录
2019
8
...
暑期实习 字节二面
1895
9
...
字节crm后端二面
1796
10
...
26春招
1409
创作者周榜
更多
正在热议
更多
#
面试___岗的必刷题单
#
884次浏览
19人参与
#
如果不上班,你会去做什么
#
32586次浏览
470人参与
#
春招开局,你有保底offer吗?
#
2944次浏览
36人参与
#
硬件开发岗知多少
#
23747次浏览
135人参与
#
三月的小目标
#
1442次浏览
40人参与
#
应届生被毁约被毁意向了怎么办
#
58670次浏览
291人参与
#
你面试被问到过哪些不会的问题?
#
113394次浏览
1904人参与
#
小厂一定不能去吗?
#
4428次浏览
67人参与
#
你经历过哪些AI幻觉?
#
769次浏览
20人参与
#
实习生的生存小技巧
#
1032次浏览
31人参与
#
找AI工作应该卷什么?
#
721次浏览
18人参与
#
实习生至暗时刻
#
1041次浏览
20人参与
#
应届生,你找到工作了吗
#
117546次浏览
718人参与
#
AI面试问题分享
#
1686次浏览
38人参与
#
牛友的志愿填报指南
#
54649次浏览
394人参与
#
业务面应该做哪些准备
#
99005次浏览
1107人参与
#
实习心态崩了
#
106054次浏览
537人参与
#
运营商笔面经互助
#
201910次浏览
1813人参与
#
开工第一帖
#
112377次浏览
1779人参与
#
我的求职精神状态
#
436798次浏览
3111人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务