全链路压测引擎的设计与实现
如果无法正常显示,请先停止浏览器的去广告插件。
1. 全链路压测引擎MAXIM的设计与实现
聶⾵風
2018.10
2. • 前期调研
• Maxim的技术演进
• 改造Gatling
• 扩展Gatling
• Maxim的未来规划
2
3. 技术选型的核心考量
将请求编排成业务场景 流量量控制
压⼒力力控制 数据跟请求参数的绑定
对分布式测试的⽀支持 测试报告
⼆二次开发的成本
3
4. 前期调研
4
5. Gatling == Maxim?
Gatling
• 只⽀支持单机模式
• 没有 GUI ⽅方便便⽤用户操作
• 不不⽀支持脚本参数化
• 不不⽀支持压⼒力力注⼊入器器系统状态监控
5
6. Features of Maxim
• ⽀支持分布式
• 简洁的 GUI,并对⽤用户隐藏压测过程的复杂性
• 管理理测试资源:脚本、数据集、压⼒力力注⼊入器器
• ⾼高效地创建、运⾏行行(⼿手动/定期)测试任务
• ⾃自动⽣生成测试报告,保留留历史报告
6
7. Maxim迭代一架构
7
8. Maxim迭代二架构
8
9. Maxim迭代一领域抽象
9
10. Maxim迭代二领域抽象
10
11. job execution状态机
11
12. Maxim控制中心的领域抽象
12
13. 改造Gatling - 日志
• 中间⽇日志存储于内存 => 中间⽇日志存储于influxdb
• 保留留历史⽇日志
• 压测报告⽣生成后删除⽇日志⽂文件, 释放磁盘空间
13
14. 扩展Gatling - dubbo协议
Protocol
DSL
Action
Check
14
15. 扩展Gatling - dubbo协议
val dubboConfig = Dubbo
.protocol("dubbo")
.generic(true)
.url("dubbo://10.9.142.55:7100")
.registryProtocol("")
.registryAddress("")
val jsonFileFeeder = jsonFile("dubbo.json").circular
val dubboScenario = scenario("Call dubbo")
.feed(jsonFileFeeder)
.randomSwitch(
15d -> exec(session => transformJsonDubboData("args_types", "args_values", session))
.exec(dubbo("com.youzan.scrm.api.cim.service.fans.MkFansScenesService", "getMarketingScenes")
.parameterTypes("${args_types}")
.args("${args_values}")
.check(jsonPath("$.code").is("200"))
.check(jsonPath("$.data.courierId").is("198705936167079393"))
),
35d -> exec(session => transformJsonDubboData("args_types1", "args_values1", session))
.exec(dubbo("com.youzan.scrm.api.cim.service.fans.FansCrowdService", "getCustomizeCrowdList")
.parameterTypes("${args_types1}")
.args("${args_values1}")
.check(jsonPath("$.code").is("200"))
.check(jsonPath("$.data.paginator.totalCount").is("20"))
),
50d -> exec(session => transformJsonDubboData("args_types2", "args_values2", session))
.exec(dubbo("com.youzan.scrm.api.cim.service.fans.MkFansPlanService", "getTeamNameList")
.parameterTypes("${args_types2}")
.args("${args_values2}")
.check(jsonPath("$.code").is("200"))
)
)
setUp(
dubboScenario.inject(atOnceUsers(100))
).protocols(dubboConfig)
15
16. 扩展Gatling - dubbo协议
[
{
},
{
},
{
]
}
"args_types": ["java.lang.Long"],
"args_values": [160],
"args_types1": ["java.lang.Long", "java.lang.Integer", "java.lang.String"],
"args_values1": [160, 1, ""],
"args_types2": ["com.youzan.scrm.api.cim.request.fans.plan.FansPlanCommonQueryDTO"],
"args_values2": [{"kdtId":160,"planId":263}]
"args_types": ["java.lang.Long"],
"args_values": [160],
"args_types1": ["java.lang.Long", "java.lang.Integer", "java.lang.String"],
"args_values1": [160, 1, ""],
"args_types2": ["com.youzan.scrm.api.cim.request.fans.plan.FansPlanCommonQueryDTO"],
"args_values2": [{"kdtId":160,"planId":263}]
"args_types": ["java.lang.Long"],
"args_values": [160],
"args_types1": ["java.lang.Long", "java.lang.Integer", "java.lang.String"],
"args_values1": [160, 1, ""],
"args_types2": ["com.youzan.scrm.api.cim.request.fans.plan.FansPlanCommonQueryDTO"],
"args_values2": [{"kdtId":160,"planId":263}]
16
17. Maxim的未来规划
• 压测过程和报告实时计算和展示
• ⾃自动⽣生成压测脚本和压测数据
• ⽀支持更更多的协议
• 开源
• …
17
18. 3Q
19.