新浪微博的一名工程师正在家里办婚礼,忽然接到公司紧急电话处理线上流量激增的问题,由于某当红明星公布了恋情,致使流量增长好多倍,而后系统出现不稳定,用户访问不顺畅。工程师没办法只能婚礼现场穿着西装打开笔记本调试代码。此时更意识到系统扩容和限流机制是多么重要啊。前端
相似现实生活中的景区限流,系统也要有对应的限流措施。算法
对系统服务进行限流,通常有以下几个模式:数据库
-
熔断:
这个模式是须要系统在设计之初,就要把熔断措施考虑进去。当系统出现问题时,若是短期内没法修复,系统要自动作出判断,开启熔断开关,拒绝流量访问,避免大流量对后端的过载请求。系统也应该可以动态监测后端程序的修复状况,当程序已恢复稳定时,能够关闭熔断开关,恢复正常服务。后端 -
服务降级:
将系统的全部功能服务进行一个分级,当系统出现问题,须要紧急限流时,可将不是那么重要的功能进行降级处理,中止服务,这样能够释放出更多的资源供给核心功能的去用。
例如在电商平台中,若是突发流量激增,可临时将商品评论、积分等非核心功能进行降级,中止这些服务,释放出机器和CPU等资源来保障用户正常下单,而这些降级的功能服务能够等整个系统恢复正常后,再来启动,进行补单/补偿处理。
除了功能降级之外,还能够采用不直接操做数据库,而所有读缓存、写缓存的方式做为临时降级方案。缓存 -
延迟处理:
这个模式须要在系统的前端设置一个流量缓冲池,将全部的请求所有缓冲进这个池子,不当即处理。而后后端真正的业务处理程序从这个池子中取出请求依次处理,常见的能够用队列模式来实现。这就至关于用异步的方式去减小了后端的处理压力,可是当流量较大时,后端的处理能力有限,缓冲池里的请求可能处理不及时,会有必定程度延迟。性能优化 -
特权处理:
这个模式须要将用户进行分类,经过预设的分类,让系统优先处理须要高保障的用户群体,其它用户群的请求就会延迟处理或者直接不处理。异步
那在实际项目中,对访问流量的限制,可采用以下几种技术方法:性能
-
熔断技术
熔断的技术能够重点参考Netflix的开源组件hystrix的作法,主要有三个模块:熔断请求判断算法、熔断恢复机制、熔断报警。优化 -
计数器方法
系统维护一个计数器,来一个请求就加1,请求处理完成就减1,当计数器大于指定的阈值,就拒绝新的请求。
基于这个简单的方法,能够再延伸出一些高级功能,好比阈值能够不是固定值,是动态调整的。另外,还能够有多组计数器分别管理不一样的服务,以保证互不影响等。spa -
队列方法
就是基于FIFO队列,全部请求都进入队列,后端程序从队列中取出待处理的请求依次处理。
基于队列的方法,也能够延伸出更多的玩法来,好比能够设置多个队列以配置不一样的优先级。 -
令牌桶方法
首先仍是要基于一个队列,请求放到队列里面。但除了队列之外,还要设置一个令牌桶,另外有一个脚本以持续恒定的速度往令牌桶里面放令牌,后端处理程序每处理一个请求就必须从桶里拿出一个令牌,若是令牌拿完了,那就不能处理请求了。咱们能够控制脚本放令牌的速度来达到控制后端处理的速度,以实现动态流控。
咱们在作服务限流的时候,仍是有一些原则和事项须要注意的:
-
实时监控:系统必需要作好全链路的实时监控,才能保证限流的及时检测和处理。
-
手动开关:除系统自动限流之外,还须要有能手动控制的开关,以保证随时均可以人工介入。
-
限流的性能:限流的功能理论上是会在必定程度影响到业务正常性能的,所以须要作到限流的性能优化和控制。
系统故障经常都是不可预测且难以免的,所以做为系统设计师的咱们,必需要提早预设各类措施,以应对随时可能的系统风险。
Original 不止思考的技术 不止思考