服务的熔断和降级

2018-09-20 17:29:18

最近在面试中和一些人无意中聊到服务的熔断和降级,这二者之间的确很相像,甚至有时候在自己的项目中明明用到了这两者,但是自己却感觉不出来,下面把这些东西梳理一下。

降级

先举个例子来解释:我们某天去窗口排队办业务,因为来的比较早,排在前面,但是今天人特别多,一会后面就排了长长的队伍,当轮到你去办业务的时候,你发现你的证件找不到了,翻遍了整个包都没有,你很急你在回忆到底证件放哪里了,但是这个时候窗口办理人员不会和你耗太多时间一直等你吧,于是和你说你先找到证件再来吧,让后面的人继续办理业务,其实这个过程就是降级,降级的目的是为了解决整体平台的压力,而牺牲掉某一服务模块而采取的措施。

其实现实中这种降级的业务在项目总也会经常出现,比如我们的一个业务是定时调度每5秒钟要去数据库定时捞一批数据做业务,做完业务后将状态修改为已处理。数据是按照时间升序去优先处理的,结果某个数据本身有问题,导致每次处理这个业务都是失败,状态不能去修改,像这种情况下,如果连续很多次都处理不了的数据是需要降级的,把级别放到后面甚至人工干预处理,而不要每次捞出这个数据都是处理不了的业务而影响到后面处理的效率。另外前面讲到过做抢购活动通过nginx限流一定会有部分用户的请求得不到系统正常的处理,所以平台一般会给用户返回到限流页面,其实这种限流也是降低的一种表现方式。

熔断

还是一样举个例子来解释:我记得二十年在外地读书,每次放假回家我是需要早上去汽车站买票坐车回家的,不像现在一样可以在网上买票方便,有一次我起的晚,去汽车站排队买票,前面排了很长,一直等啊等,终于等到我到窗口,这个时候售票员直接给我说今天的到我们那个地方的票卖完了,明天再来排队吧,非常郁闷。像这种情况其实就是熔断。熔断的目的是当平台某个服务模块中的某块程序出现故障后为了不影响其他客户端的请求而做出的及时回应。

其实我们每个人的现实项目都有熔断处理的业务场景,我就不信没有了,像我们常用的HttpClient大家总见过吧, 它里面的setConnectTimeout就是设置连接超时时间,连接超时一种保护措施,如果设置的过大,会严重影响后面的排队消耗过多的资源,类似的还有数据库连接超时等等。

聊到熔断和降级其实springcloud都有这些封装好的功能,像我的物联网项目(二十八) springcloud feign超时重试问题其实就是服务降级的另外一种表现,集群中的一台服务失败,重试另外一台服务, 也就是主逻辑失败采用备用逻辑的过程。springcloud中的Hystrix熔断我们自定义的Fallback返回状态其实就是超时的返回信息。

(微信打赏)

(支付宝打赏)
原创不易,谢谢赞赏。你的支持就是我的动力,我会更加努力。

当今主流云服务器代金劵,优惠折扣最大力度推荐。

阿里云产品1888元服务器代金券大礼包免费领取。

阿里云服务器低门槛上云捷径,普惠上云,云服务器1核1G仅需293元/年。

企业级高性能实例,限时2-5折,限首次购买ECS用户参与,限购4台。

腾讯云代金券新用户满200减150 满500减375 满1000减750 满2000减1500。

腾讯云服务器,数据库热卖云产品3折起,爆品低至1折。

腾讯云业界领先的性价比,0.57元/天起,关注最新活动,免费体验产品。