31 | 如何应对接口级的故障?
31 | 如何应对接口级的故障?
讲述:安晓辉
时长20:03大小18.31M
1. 降级
1.1 系统后门降级
1.2 独立降级系统
2. 熔断
3. 限流
3.1 基于请求限流
3.2 基于资源限流
限流算法
(1)时间窗
(2)桶算法
4. 排队
小结
赞 36
提建议
精选留言(53)
- 空档滑行2018-07-081.对于用户服务,在抢购期间可以准备降级策略,压力过大时保证用户登录的可用,注册和修改信息可以做降级处理 2.抢购下单涉及到订单,库存,和商品查询。可通过请求排队来限流,超出库存的请求直接返回。 为了应对库存和商品服务可能发生的故障,可以提前对商品数据和库存数据做缓存,如果对端服务故障,本地也可以提供服务 3.支付依赖第三方系统,合理设置熔断策略,如支付平均时长超过限制可提示用户稍晚做支付展开
作者回复: 分析全面👍👍
共 2 条评论141 - climber2018-07-081.抢购页面最大程度静态化,一般用户开始前会尝试刷新页面,查询压力要比下单压力大很多 2.抢购页面要求登陆后访问,一般人不会抢购开始那一刻才进来,错开登陆压力 3.活动未开始,不允许点击抢购按钮。对请求做轻量分析,对于请求过频繁或者可疑ua等做拉黑,为防误杀要求输验证码 4.抢购下单接口采用排队+限流,降低压力的同时保证公平性,如抢购1000件,只放2000人进来,其他返回排队人数过多。进来的请求全部入列,固定数量的队列消费者控制订单生成速率以及走到支付流程的速率。支付是下单流程核心功能,降级不应该降级掉。队列做削峰,保证支付系统不会压力过大。 请指正~展开
作者回复: 分析的很好,支付如果依赖第三方的话,需要考虑熔断,然后做补偿或者容错措施,例如提示用户10分钟后再来支付
共 3 条评论47 - 张浩2018-09-14我发现了,系列文章越到后面,人越少.还好我坚持看到了这里...
作者回复: 😄😄被你发现了,一定要坚持
26 - 凡凡2018-07-081.登录接口在流量特别大的时候,可以适当降级,较少参与人数,另外一点是登录一般有有效期(尤其对于web客户端),可以适当延长登录有效期。2.抢购接口采用队列方式,无法支撑时,也可以适当限流。另外一点,秒杀一般还会有一个秒杀结果查询的接口,也可以降级或者减小请求频次。3.支付接口,一般第三方支付对接入方有流量限制,可以提前申请扩大限制,同时做好降级准备。
作者回复: 分析更好,支付接口依赖第三方应该是熔断,然后做好容错措施,例如提示用户10分钟后来支付
19 - 星火燎原2018-07-07整点限量抢购核心业务应该是登录和抢购,抢购完了放入购物车不一定马上支付,所以在系统负载较高的时候可以让支付接口做降级处理,过了整点再恢复。抢购接口一般采取商品对应一个抢购队列,队列到上限之后拒绝流量进来,系统根据自身负载情况去消息队列进行流量的拉取,大致思路如上所述,还有什么遗漏还请老师指教
作者回复: 一般不建议对支付做降级,用户体验很不好,还不如登录和抢购阶段限流,这是有心理学理论支撑的,用户没抢到前,如果抢不到他会认为自己运气不好,但如果用户抢到了没法支付,他会觉得自己损失了,会触发“损失厌恶”心理😄
14 - 何磊2018-08-10老师你好,关于排队方式请教个问题: 比如用户从pc发一个请求过来,我们将这个请求放到队列,这个时候就直接返回客户端,客户端定时轮训排队状况,还是说是其它处理方案呢?
作者回复: 常见的有:1. 轮询,2. Long polling,3. HTTP/2推送
共 2 条评论10 - Tom2018-07-09功能:登录、抢购、支付。 接口故障应对方法:降级、熔断、限流和排队。 三个功能是有依赖关系的,登录了才能抢购,抢购了才能支付。因此如果从依赖关系考虑,总体访问量过大无法满足时,降级时优先保留登录,其次是抢购,再其次是支付。但是支付是成交关键,并且访问数量比登录抢购少很多,可以说不是一个数量级,因此我觉得支付优先级是最高的。 其中只有支付涉及外部调用,因此只需为支付提供熔断方案。 抢购功能提供排队和限流方案,对于每个参与抢购活动的商品根据商品数量设定队列长度,限流也根据商品数量进行限流。 支付失败要怎么处理?展开
作者回复: 假如降级时优先保证登录,但是用户登录进来后发现抢购不了,其实体验也不好,而且已经抢购了的用户可能无法支付,这样体验更不好,甚至会引起投诉,因此抢购类降级是优先降登录会好些,保留抢购和支付,保证进来的用户能够完成业务流程。 支付失败真没什么好办法了,因为这是核心链路的核心功能。
7 - 奋斗心2018-09-27访问的流量在每个环节可能逐步递减(登陆例外) 1、引导部分用户提前登陆; 2、秒杀价系统独立部署(感觉和其他系统部署在一起才需要降级); 3、抢购使用排队方式。有界队列,队列大小可以预估较大长度,队列外的拒绝; 4、(如果要求以支付成功为准)通过队列和熔断。 (如果以下单成功为准)使用熔断。提醒稍后再付展开
作者回复: 正确👍
4 - 食指可爱多2018-07-26“每一个参加秒杀活动的商品保存一个队列,队列的大小可以根据参与秒杀的商品数量(或加点余量)自行定义。”我之前也思考过类似于淘宝秒杀或12306这种高并发系统,应该不会所以资源在一个队列里排队,这样整个系统并发度无法水平伸缩,那么请问老师一个技术细节问题,每个商品一个队列这个有啥推荐的实现方案吗?
作者回复: 用kafka,用商品id做队列名称就可以了
4 - 小文同学2018-07-071、在抢购开始前,可以通过降级来保证登陆服务。例如提前半小时限制注册、修改用户信息的服务。 2、整个流量的洪峰应该在于下单。下单可以同时基于限流和排队两种方案,这个需要大概估计到。譬如说100W人抢购100件商品,可以在整点时对下单操作做99%的限流,把1000K的访问问题改写为10k,10k里面再进行排队。 3、支付属于第三方调用,使用熔断机制(譬如说下单后保留30分钟的支付的时间,等待支付宝服务恢复) 未实际开发过实际抢购系统,期望老师和其他同学提供好的方案借鉴学习展开
作者回复: 基本思路就是这样的,另外,登录也可以降级
4 - 小狮子辛巴2018-11-20第一版(不看评论的思考回答) 假如有100种商品,每个商品1k件。首先设计100个队列。 对于已经登录的用户 限定每个队列只能有1w个排队的人,如果超过1w人,就提示人数太大,只能等下次了。 已经未登录的用户 如果抢购时间段同时登录人数太多,超过100w, 逐步降级和熔断 a.可以登录,但不能参与抢购了 b.暂停登录,拒绝服务 (防止把系统拖垮,影响正常的不抢购的用户) 第二版(看过评论之后的思考回答) 1、 忘记了熔断是对外的。老师特意提示了依赖了第三方支付。 所以上面 逐步降级和熔断 感觉应该是 逐步降级和限流 假如有100种商品,每个商品1k件。首先设计100个队列。 对于已经登录的用户 1、抢购 限定每个队列只能有1w个排队的人,如果超过1w人,就提示人数太大,只能等下次了。 2、熔断处理, 提示抢购成功的同学,“歇歇再支付,不着急。” 分散支付请求 。 已经未登录的用户 如果抢购时间段同时登录人数太多,超过100w, 逐步降级 a.可以登录,但不能参与抢购了 b.暂停登录,拒绝服务 (防止把其他系统拖垮,影响正常的不抢购的用户)展开
作者回复: 认真思考,点赞👍
3 - 孙振超2018-09-09登录大体可分为免密登录和非免密登陆(包含登陆密码、人脸登陆、短信登录等),95%左右的都是免密登录,内部的实现相对也比较简单,采用限流方式就可以了;对于非免密登录,内部实现相对会复杂些,并且会有风控策略,因而面对大流量需要同时采取限流和内部降级两种策略了。 对于抢购,优先采用排队策略,可以避免限流策略下前面的用户因限流导致抢购失败而后面的用户限流通过情况下用户体验不好的情况。 支付采用熔断策略即可,同时要将对应的错误码进行适当的优化,并提供用户再次进行支付的入口。熔断策略的实现可能会稍微有点复杂,并且需要系统报警+人工确认双重保证,避免网络、机器、电源等情况引起的误触发。展开
作者回复: 正确
3 - 100kg2018-07-08老师,我有个双机那节的问题,如果采用了mysql 双主架构,对于库存这样的字段,在并发较高时,如果两个mysql同时 update 了库存(采用乐观锁,库存本身作为版本号),这样会不会导致货物被两个人购买但库存却只减了1呢?该怎么解决呢?求赐教
作者回复: 会的,库存不能用双主
3 - InfoQ_6792a017d8d32020-08-23真是非常棒。 这节不仅讲了降级、限流、排队、熔点。 还让个人了解了上述知识在整个可用性架构中的位置。 对引导构建已有知识的架构体系尤为有用。 这课买的赚飞了,顺便还买了书,还是更喜欢翻书的感觉展开
作者回复: 加油������
2 - hello2018-08-15我认为核心需要保证的业务的是抢购,抢购业务可能并发用户较多,对于抢购可以采取排队策略,对参与抢购的用户进行排队。对于登录服务,当发生接口故障的时候,为了保证抢购业务顺利,可以采取降级策略,可以让部分用户登录失败,可以停掉注册等接口,当大量调用支付系统,而支付系统反应慢而影响整个系统的时候,可以对支付系统进行容错处理,可以让用户过段时间再支付。对于熔断的阈值可以根据具体的业务来判断。
作者回复: 分析正确👍👍
2 - 黄堃健2020-06-17结合应用场景就更好了,觉得有点空洞
作者回复: 每个读者都有自己不同的应用场景,而且文中已经有案例了
1 - H2020-05-10想问一个问题。关于设计一个接口,一台机器能抗多少量。应该根据一天的总请求量,响应时间,cpu,内存等参数,根据哪个参数来设计? 比如我现在一个接口的一天访问量是2500W,20WDAU。如果推量到100WDAU,访问量是不是直接涨5倍,12500W访问量?往指教
作者回复: 将一天的总请求数量折算成TPS,另外,TPS是测试出来然后不断进行优化达到成本目标!例如,你们想用5台机器就能支撑,那推算出来每台每天就是500W访问量。 理论上来说,DAU和TPS是同步增长的
2 - 那迦树2020-03-26还是要有容灾能力,用集群或者服务降级的方式应对1
- 谭方敏2020-03-09降级(从系统功能优先级角度应对故障,将某业务或者接口功能降低,不提供或者全部停止某部分业务功能) 主要的方式有: 1)后门降级,加个后门,url带参数,通过tcp或者http的方式去下达指令。 2)独立系统降级,将降级的系统或者功能单独部署起来,给予访问。 限流(从用户访问角度来应对故障,超出访问量部分的数据将被丢弃,主要包括两种方式:基于请求限流,基于资源限流) 熔断(应对依赖的外部故障的情况,通常是访问第三方系统,或者是业务系统内部跨模块调用) 排队(借助中间件) 思考题,登录,抢购,支付。这是典型的漏斗模型,首先大量的访问量将在登录产生,因而登录可以采用降级和限流,抢购会产生大量并发,可以采用队列,按照顺序处理,最后支付,一般会调用第三方接口,在没有及时返回结果的话,就需要熔断。 结合公司业务,在服务器重启的时候,会有数以十万计的登录业务请求产生,基于这样的原因,我们在nginx那边做了基于请求量限流:每秒控制2000的访问的请求。 而在业务系统访问云平台的地方增加了熔断,业务系统访问一个gettoken接口,如果30秒没有返回的话,就产生熔断警告信息。展开1
- Andy2019-05-09请教老师一个技术之外的问题,解决方案架构师和系统架构师的区别是什么?各有什么侧重点吗
作者回复: 解决方案架构师偏业务,系统架构师偏技术,例如来了一个地铁项目,先由解决方案架构师分析需求,业务,然后再交给系统架构师设计方案架构
1