量化模拟线上流量实践
在之前的文章分段随机实践—模拟线上流量中,分享了分段模拟的实现,在实际工作中应用这种方法可以对线上流量进行更加精细化的模拟。
今天分享一下实际工作中某个服务模块中的应用。这里选择这个模块的原因两个:大多数都是 GET 接口;参数简单,大部分都是单个参数。
梳理模型
模块模型
对于整个该服务的 PI 接口,可以对于某一段时间的日志统计分析,可以得出各个接口请求流量的比例。或者通过统计服务。也是可以得到。整个接口的流量比例模型。
这里我将流量比例存在一个 map 里面里面,数据如下:
这里做了一个简单的缩放,将所有的值除以最小值算得的比例。以后会将接口按照流量数量级分成不同的等级,对不同等级的接口分别进行模拟实现。对于日常流量偏小(暂定小于 5QPS)的接口,统一按照日常流量的 20 倍进行固定 QPS 作为基础背景流量。
接口模型
然后对接口的参数进行统计,依然可以通过日志统计(GET 接口均可),获取每个参数的比例。
依旧将数据放在一个 map 中,数据如下:
计算方式同上,这里并未对所有参数进行穷尽,主要原因两个:一个是接口参数分布比较集中,通过少量(前 10 或者前 20)即可达到目的;一个是某些接口的参数是组合式的,如果穷尽太多了,不适合现在业务框架,以后可以做成配置文件。
实践
这里先分享接口流量,再分享服务流量,因为两者有依赖关系。
接口流量
通过框架提供支持,将接口封装成一个方法,暴露相关参数,例如:
通过 random 方法即可将配置MApi#BS_ARGS
中的参数按照value
比例传到方法M#bs(java.lang.String)
中,达到量化模拟线上流量的目的。
模块流量
首先根据项目框架将接口封装,然后根据配置文件MApi#urls
中的内容,进行接口请求。
实现如下:
依旧是通过random
方法,一开始担心性能问题,经过实测,random 性能百万 QPS 没有问题,这里需要的是线程安全,可以多线程使用同一个MApi#urls
。
Have Fun ~ Tester !
版权声明: 本文为 InfoQ 作者【FunTester】的原创文章。
原文链接:【http://xie.infoq.cn/article/bdad505a073bd227d3fa5e732】。文章转载请联系作者。
评论