2017/11/21 发布
一、引言
这两周在开发广告服务平台时,部署新版程序出现了在本地测试与服务器生产环境测试差异很大,导致新版上线延迟的问题。主要表现在线上500台左右设备请求并发时,新版程序无法稳定运行的问题。
由于是新开发的平台,测试环境并未配置齐全,并且生产环境服务器并未使用Jenkins等持续集成工具,无法进行良好的版本控制,新版本与上一版本改动较大,无法精准定位问题所在。
因此决定复制生产环境的流量,模拟出同等条件的测试环境,进行问题排查。
我们选择使用go语言实现的简单的http流量复制工具——Gor,将80端口的流量进行等量复制到测试环境端口中,模拟条件相同的压力测试环境,采用与生产环境相同的测试数据库,找到并且解决问题。
二、Gor简介
Gor 是一款go语言实现的简单的http流量复制工具,它的主要目的是使你的生产环境HTTP真实流量在开发环境和语言预演环境(staging server)重现。
Gor下载地址https://github.com/buger/goreplay/releases
工具使用非常简单,并同时支持linux、mac、windows版本。下面是它的工作的流程,监听服务器捕捉http流量,把捕捉到的流量发送到重现服务器上或者保存到文件中,重现服务器再继续把流量发送到一个指定的ip地址。
三、用法简介
使用Gor,将下载的文件复制到目标盘中,windows下为exe文件,在盘符中shift+右键进行命令行操作。按照下列操作可以使用gor各种功能。
简单的 HTTP 流量复制:
gor –input-raw :80 –output-http “http://staging.com”
HTTP 流量复制频率控制:
gor –input-tcp :28020 –output-http “http://staging.com|10″
HTTP 流量复制缩小:
gor –input-raw :80 –output-tcp “replay.local:28020|10%”
HTTP 流量记录到本地文件:
gor –input-raw :80 –output-file requests.gor
HTTP 流量回放和压测:
gor –input-file “requests.gor|200%” –output-http “staging.com”
HTTP 流量过滤复制:
gor –input-raw :8080 –output-http staging.com –output-http-url-regexp ^www.
注入改变请求流量header:
gor –input-raw :80 –output-http “http://staging.server” –output-http-header “User-Agent: Replayed by Gor” –output-http-header “Enable-Feature-X: true”
可以通过 gor –help 查看更多用法。
四、总结
在测试环境不成熟的开发中,可以通过Gor等流量复制工具,将生产环境的流量进行复制。通过压力测试进行正式上线的仿真测试。
经压力测试排查,发现问题根源并非存在于新版程序中,而在于tomcat的环境配置中时区设置出现问题。导致对于数据库的时间插入以及搜索操作出现时间偏差,导致程序中不断循环插入检索相同的字段,导致数据库的“死锁”问题。
这也警示我们设计程序的时候,需要考虑到大量并发可能出现的问题,并进行预防。并且需要有良好的测试设计。