在面试过程中,系统高并发是经常需要考察的,而熔断限流又是必考的,当面试官问及如何确定限流的阈值时,他们实际上是在考察你是否理解限流的本质及其在实际工作中是否有过经验。限流是一种常用的系统保护措施,用于防止过量流量或请求冲垮后端服务。正确设置限流阈值对于维持系统的稳定性和可用性至关重要,下面我们一起深入了解如何在面试中回答这一问题,并在实际工作场景中如何确定限流阈值。
总体上来看有4个方法:压测、观测、类比、手动计算
压力测试
全链路压测:全链路压测是确定阈值的最佳方法,因为它最接近线上真实环境,能提供最准确的数据。
性能测试曲线模型是一条随着测试时间不断变化的曲线,与服务器资源,用户数或其他的性能指标密切相关的曲线。
一般的性能测试曲线图主要分为三个区域,分别是:light load(轻压力区),heavy load(重压力区)和 Buckle Zone。
图中的三条曲线,分别代表:Utilization(资源利用率,指软硬件资源),Throughput(吞吐量,即单位时间内处理请求的数量),Response Time(响应时间)。
图中坐标轴的横轴从左到右表示并发用户数(Number of Concurrent Users)的不断增长。
最佳并发数 之前QPS 虽然在上升,但是响应时间稳定不变。在这个时候资源利用率也在提升,所以选择最佳并发数 你可以得到最好的性能和较高的资源利用率。最大并发数是系统快要崩溃的临界点。很多人会选择这个点作为限流的阈值。这个点响应时间已经比较长了,但是系统还能撑住。选择这个点意味着能撑住更高的并发,但是性能不是最好的,吞吐量也不是最高的。
使用服务的观测数据
利用监控系统来观测数据来确定阈值。例如,如果观察到的业务高峰期整个集群的QPS未超过1000,可以将阈值设定为1200,预留200的余量。
不过这种方式有一定局限性。业务峰值不代表系统的极限性能,仅依靠观测数据可能导致阈值偏低。
类比其他服务
参考相似服务:如果无法进行压测,可以参考类似服务的阈值,或根据服务之间的调用关系和转化率来估算阈值。
比如说创建订单到支付,会有一个转化率,假如说是 90%,如果创建订单的接口阈值是 200,那么支付的接口就可以设置为 180。
手动计算
当没有可参考的数据时,通过分析服务的调用链路,统计数据库查询、微服务调用、第三方中间件访问次数来手动估算阈值。
比如一个服务有个接口,接口会进行数据库查询,然后进行计算。假设查询一次数据库会耗时 10ms,那么再增加 10 ms 作为 CPU 计算耗时,这一个接口预期的响应时间是 20ms。如果一个实例是 4 核,那么就可以简单用 1000ms÷20ms×4=200 得到阈值。
手动计算很不准确,正常服务也不可能只有一个接口还需要考虑GC等情况。
这里就需要动态调整,建议将阈值设置为可动态调整,以便根据实际运行情况进行优化。
在回答时,展现出你能够根据不同情况采用不同策略,并理解每种方法的优点和局限性,这将体现出你的专业知识和灵活应变能力。同时,解释方法的选择依据和潜在风险,可以进一步证明你的深度思考和对系统稳定性重视程度。这样的回答不仅回答了面试官的问题,还展示了你全面考虑问题和解决问题的能力,这对面试是非常有帮助的。