32.【学习心得】学习心得-熔断场景

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云原生内存数据库 Tair,内存型 2GB
云数据库 Redis 版,经济版 1GB 1个月
简介: 【学习心得】学习心得-熔断场景

文档参考:书名:《从程序员到架构师:大数据量、缓存、高并发、微服务、多团队协同等核心场景实战》-王伟杰

image.png

前文如下:


23.【学习心得】学习心得-冷热分离概述

24.【学习心得】学习心得-如何分离冷热数据

25.【学习心得】学习心得-基于MySQL的分表分库

26.【学习心得】学习心得-读缓存

27.【学习心得】学习心得-如何更新redis缓存

28.【学习心得】学习心得-写缓存

29.【学习心得】学习心得-写缓存实现思路

30.【学习心得】学习心得-秒杀架构

31.【学习心得】学习心得-全链路日志


1. 业务场景:如何预防一个服务故障影响整个系统


在一个新零售架构系统中,有一个通用用户服务(很多页面都会使用),它包含两个接口。


1)第一个是用户状态接口,包含用户车辆所在位置。它在用户信息展示页面都会用到,比如客服系统中的用户信息页面。

2)第二个接口用于返回给用户一个可操作的权限列表,它包含一个通用权限,也包含用户定制权限,而且每次用户打开App时都会使用它。而这两个接口各自会碰到相应的问题,下面分别讨论。


1.1 第一个问题:请求慢


用户状态的接口、服务间的调用关系如图10-1所示。在Basic Data Service(基础数据服务)中,接口/currentCarLocation需要调用第三方系统的数据,但第三方响应速度很慢,而且有时还会发生故障,导致响应时间更长,接口经常出现超时报错


有一次,用户反馈App整体运行速度慢到无法接受的程度。运维人员通过后台监控查看了几个Thread Dump(线程转储),发现User API与Basic Data Service的线程请求数接近极限值,且所有的线程都在访问第三方接口(3rd Location API)。因为连接数满了,其他页面便不再受理User API的请求,最终导致App整体出现卡顿。


网络异常,图片无法展示
|


之前运维人员针对这个问题做过相关处理,考虑响应时间长,就把超时时间设置得很长,这样虽然超时报错少了,其他页面也保持正常,但是会导致客服后台查看用户信息的页面响应时间长。


1.2 第二个问题:流量洪峰缓存超时


户权限的接口、服务间的调用关系与上面类似,如图10-2所示。服务间的调用流程具体分为以下3个步骤。


网络异常,图片无法展示
|


1)APP访问User API。

2)User API访问Basic Data Service接口/commonAccesses。

3)Basic Data Service提供一个通用权限列表。因为权限列表对所有用户都一样,所以把它放在了Redis中,如果通用权限在Redis中找不到,再去数据库中查找。


所以把它放在了Redis中,如果通用权限在Redis中找不到,再去数据库中查找。


有一次,因为历史代码的原因,在流量高峰时Redis中的通用权限列表超时了,那一瞬间所有的线程都需要去数据库中读取数据,导致数据库的CPU使用率升到了100%。


数据库崩溃后,紧接着Basic Data Service也停了,因为所有的线程都堵塞了,获取不到数据库连接,导致Basic Data Service无法接收新的请求。User API因调用Basic Data Service的线程而出现了堵塞,以至于User API服务的所有线程都出现堵塞,即User API也停止工作,使得App上的所有操作都不能使用,后果比较严重。


2 覆盖场景


为了解决以上两个问题,需要引入一种技术,这种技术还要满足以下两个条件。


2.1 线程隔离


首先针对第一个问题进行举例说明。假设User API中每个服务配置的最大连接数是1000,每次API调用Basic Data Service的/currentCarLocation时速度会很慢,所以调用/currentCarLocation的线程就会很慢,一直不释放。


那么原因可能是,User API这个服务中的1000个连接线程全部都在调用/currentCarLocation这个服务。因此,希望控制/currentCarLocation的调用请求数,保证不超过50条,以此保证至少还有950条连接可用于处理常规请求。如果/currentCarLocation的调用请求数超过50条,就设计一些备用逻辑进行处理,比如在页面上给用户提示。



2.2 熔断


针对第二个问题,因为此时数据库并没有死锁,流量洪峰缓存超时只是因为压力太大,所以可以使Basic Data Service暂缓服务、不接收新的请求,这样Redis的数据会被补上,数据库的连接也会降下来,服务也就没问题了。


总结一下,这个技术应能实现以下两点需求。


1)发现近期某个接口的请求经常出现异常时,先不访问接口的服务。

2)发现某个接口的请求总是超时时,先判断接口的服务是否不堪重负,如果是,就先别访问它。


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
缓存 负载均衡 NoSQL
30.【学习心得】学习心得-秒杀架构
【学习心得】学习心得-秒杀架构
30.【学习心得】学习心得-秒杀架构
|
缓存 监控 算法
34.【学习心得】学习心得-限流
【学习心得】学习心得-限流
34.【学习心得】学习心得-限流
|
缓存 监控 架构师
33.【学习心得】学习心得-熔断技术选型
【学习心得】学习心得-熔断技术选型
33.【学习心得】学习心得-熔断技术选型
|
缓存 运维 监控
21.【学习心得】学习心得-限流和降级
【学习心得】学习心得-限流和降级
21.【学习心得】学习心得-限流和降级
|
SQL 缓存 架构师
35.【学习心得】学习心得-数据一致性
学习心得】学习心得-数据一致性
35.【学习心得】学习心得-数据一致性
|
缓存 NoSQL 中间件
31.【学习心得】学习心得-全链路日志
【学习心得】学习心得-全链路日志
31.【学习心得】学习心得-全链路日志
|
存储 缓存 架构师
28.【学习心得】学习心得-写缓存
【学习心得】学习心得-写缓存
28.【学习心得】学习心得-写缓存
|
消息中间件 中间件 应用服务中间件
15.【学习心得】学习心得-传统分布式事务
【学习心得】学习心得-传统分布式事务
15.【学习心得】学习心得-传统分布式事务
|
缓存 算法 Java
22.【学习心得】学习心得-流量调度
22.【学习心得】学习心得-流量调度
22.【学习心得】学习心得-流量调度
|
存储 设计模式 缓存
29.【学习心得】学习心得-写缓存实现思路
【学习心得】学习心得-写缓存实现思路
29.【学习心得】学习心得-写缓存实现思路