知识卡片
VCR流量录制工具:序列化真实请求替代手写日志解析,单线程异步降低对生产的影响
内容
传统压测方式要构造压测请求,往往需要写大量代码去解析线上日志、还原出请求的完整结构,一旦请求的数据结构比较复杂,这个解析过程很容易出错,也是压测耗时的主要原因之一。这套压测工具设计了一个叫VCR(录像机)的组件来彻底绕开这个问题:不再依赖”从日志里解析还原请求”这条路径,而是直接在生产环境的一台机器上部署VCR,把线上真实发生的请求本身序列化后写下来——因为直接序列化的是请求对象本身,而不是先落成日志文本再反过来解析,天然避免了日志解析过程中容易出错的环节。VCR和业务代码运行在同一个进程里,但为了把对线上服务的性能影响降到最低,特意采用单线程异步写的方式来完成这个拷贝动作(而不是同步阻塞地等写完成),并且限制了采集量(最多采集一万条日志),这样即使VCR本身出现异常或者写入变慢,也不会拖慢主业务线程对请求的正常处理。这个设计给出了两条值得记住的经验:一是当”从中间产物(日志)反推原始数据(请求)”这条路径容易出错时,如果条件允许,应该考虑直接在数据产生的源头把原始形态记录下来,而不是依赖有损的中间格式再做逆向工程;二是任何要部署在生产环境、和业务代码共享进程和资源的辅助工具(监控、采集、录制),都必须认真设计成异步、非阻塞、有采集上限的形式,主动限定它可能对主业务造成的最坏影响,而不能假设”只是顺手记录一下”就不会有风险。
参考来源
- 位置:《高可用架构(第1卷)》第3章《电商架构热点专题》"3.5 某公司线上真实流量压测工具构建"节,"3.5.3 构建自己的压测工具"及"3.5.4 疑问与解惑"(源文件:_epub-src/OEBPS/Text/Chapter3_5_4.xhtml、Chapter3_5_5.xhtml)
- 结论依据:原文说明"我们提供了一个叫VCR(录像机)的工具来拷贝流量。VCR能够将线上的请求序列化后写到……需要部署在生产环境的一台机器上,为了降低对线上服务的影响,这里采取了单线程异步写的方式来拷贝流量",以及问答环节"VCR和业务代码是同一个进程,单开异步线程进行拷贝……流量拷贝的话是采取单线程异步的方式,最多采集一万条日志",共同支撑本卡片结论。
- 原始内容:我们提供了一个叫VCR(录像机)的工具来拷贝流量。VCR能够将线上的请求序列化后写到……为了降低对线上服务的影响,这里采取了单线程异步写的方式来拷贝流量……VCR和业务代码是同一个进程,单开异步线程进行拷贝。