知识卡片

把压测问题抽象成init/run/destroy三段式模型:让协议差异收敛到一处

普通读书笔记卡

内容

面对HTTP、Thrift等不同协议服务都要支持压测这个需求,一个容易陷入的误区是为每种协议单独写一套完整的压测流程。这套压测工具的做法是先把”压测”这个动作本身拆解成三个通用阶段:init方法负责所有初始化工作(连接数据库、创建客户端等),与具体测什么服务无关;run方法负责真正发出压测请求,通常用多线程并发访问来制造足够的压力,同时记录每次请求的发起时间和结束时间,两者相减就能得到响应时间,进而计算出TP90、平均响应时间、最大响应时间这些指标;destroy方法负责压测结束后的资源回收(关闭RPC连接、关闭数据库连接等)。这个三段式结构一旦确定下来,无论压测的是HTTP服务还是Thrift服务,本质上只有run方法里”怎么发起一次具体请求”这一部分不一样,init和destroy这两段完全可以复用同一套逻辑,用一个统一接口就能同时覆盖两种协议——不需要为每种协议单独设计一整套压测流程。这个案例印证了一条被反复验证的架构原则:很多表面上看起来复杂多样的问题(不同协议、不同服务的压测),只要找准了它们共同的、不随协议变化的骨架(初始化-执行-清理),把真正因协议而异的部分收敛到骨架里最小的一处(这里是run方法),剩下的通用逻辑就都可以复用,整个系统的复杂度会因此大幅下降——设计一个通用工具时,第一步往往不是急着适配每一种具体场景,而是先找出这些场景背后共享的最小抽象。

参考来源

- 位置:《高可用架构(第1卷)》第3章《电商架构热点专题》"3.5 某公司线上真实流量压测工具构建"节,"3.5.3 构建自己的压测工具"(源文件:_epub-src/OEBPS/Text/Chapter3_5_4.xhtml) - 结论依据:原文说明"首先,在init方法里面,进行一些初始化的工作……其次,在法里发出压测请求……记录每次请求的发起时间和结束时间……最后,等压测结束后,通过destroy方法进行资源回收……无论是HTTP还是Thrift服务的压测,本质都是run方法的不同",直接支撑本卡片结论。 - 原始内容:首先,在init方法里面,进行一些初始化的工作,比如连接数据库、创建客户端等……最后,等压测结束后,通过destroy方法进行资源回收等工作……无论是HTTP还是Thrift服务的压测,本质都是run方法的不同。