前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >量化模拟线上流量实践

量化模拟线上流量实践

作者头像
FunTester
发布2021-10-20 11:32:56
2930
发布2021-10-20 11:32:56
举报
文章被收录于专栏:FunTesterFunTester

在之前的文章分段随机实践—模拟线上流量中,分享了分段模拟的实现,在实际工作中应用这种方法可以对线上流量进行更加精细化的模拟。

今天分享一下实际工作中某个服务模块中的应用。这里选择这个模块的原因两个:大多数都是GET接口;参数简单,大部分都是单个参数。

梳理模型

模块模型

对于整个该服务的PI接口,可以对于某一段时间的日志统计分析,可以得出各个接口请求流量的比例。或者通过统计服务。也是可以得到。整个接口的流量比例模型。

这里我将流量比例存在一个map里面里面,数据如下:

代码语言:javascript
复制
    public static final Map<String, Integer> urlsQps = new HashMap<String, Integer>() {{
        put(a, 9502);
        put(b, 6445);
        put(c, 1228);
        put(d, 973);
        put(e, 827);
        put(f, 546);
        put(g, 132);
        put(h, 113);
        put(i, 47);
        put(j, 1);
    }};

这里做了一个简单的缩放,将所有的值除以最小值算得的比例。以后会将接口按照流量数量级分成不同的等级,对不同等级的接口分别进行模拟实现。对于日常流量偏小(暂定小于5QPS)的接口,统一按照日常流量的20倍进行固定QPS作为基础背景流量。

接口模型

然后对接口的参数进行统计,依然可以通过日志统计(GET接口均可),获取每个参数的比例。

依旧将数据放在一个map中,数据如下:

代码语言:javascript
复制
    public static final String BS = "****";
    public static final List<String> BS_ARGS = SourceCode.randomMem(new HashMap<String, Integer>() {{
        put("aaa",3);
        put("bbb",2);
        put("ccc",2);
        put("ddd",1);
        put("eee",3);
        put("fff",1);
    }});

计算方式同上,这里并未对所有参数进行穷尽,主要原因两个:一个是接口参数分布比较集中,通过少量(前10或者前20)即可达到目的;一个是某些接口的参数是组合式的,如果穷尽太多了,不适合现在业务框架,以后可以做成配置文件。

实践

这里先分享接口流量,再分享服务流量,因为两者有依赖关系。

接口流量

通过框架提供支持,将接口封装成一个方法,暴露相关参数,例如:

代码语言:javascript
复制
    /**
     * 获取信息
     * @param instId
     * @return
     */
    JSONObject bs(String Id = random(MApi.BS_ARGS)) {
        String url = MApi.BS
        def params = getParams()
        params.instId = instId
        def response = getGetResponse(url, params)
        print(response)
        response
    }

通过random方法即可将配置MApi#BS_ARGS中的参数按照value比例传到方法M#bs(java.lang.String)中,达到量化模拟线上流量的目的。

模块流量

首先根据项目框架将接口封装,然后根据配置文件MApi#urls中的内容,进行接口请求。

实现如下:

代码语言:javascript
复制
/**
 * 量化模拟全量接口
 */
    public void all() {
        def url = random(MApi.urls)
        if (url == MApi.a) {
            a()
        } else if (url == MApi.b) {
            b()
        } else if (url == MApi.c) {
            c()
        } else if (url == MApi.d) {
            d()
        } else if (url == MApi.e) {
            e()
        } else if (url == MApi.f) {
            f()
        }

    }

依旧是通过random方法,一开始担心性能问题,经过实测,random性能百万QPS没有问题,这里需要的是线程安全,可以多线程使用同一个MApi#urls

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-10-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FunTester 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 梳理模型
    • 模块模型
      • 接口模型
      • 实践
        • 接口流量
          • 模块流量
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档