`

从0到1构建美团压测工具

阅读更多

美团内部的RPC服务大多构建在Thrift之上,在日常开发服务的过程中,需要针对这些服务进行压力测试(以下简称压测)来发现潜在问题。常用的方法有:

  • 使用一些脚本语言如:Python、Ruby等,读取线上日志构建请求,用多线程模拟用户请求进行压测
  • 使用开源工具进行压测

然而,无论采取哪种方法,压测都是一个十分耗时而又繁琐的过程,主要痛点有:

  • 需要写很多代码解析日志,还原请求,对于比较复杂的请求,解析很容易出错
  • 需要搭建脚本或者工具的运行环境,通常这一过程比较耗时
  • 由于打压方法没有统一,导致打压的结果指标比较混乱,有的结果甚至以终端输出的方式展示,非常不直观
  • 对一个应用的打压测试,由于环境、代码的问题,导致组内同学很难共享

针对上述问题,提供一个简单好用的压测工具是十分有必要的。

是否有必要重复造轮子

在构建压测工具之前,对于一些现有的开源工具进行了调研。现在主流的压测工具主要有以下几个:

JMeter

JMeter是一个比较老牌的压测工具,主要针对HTTP服务进行打压,该工具在以下方面并不满足美团内部的压测需求:

  • 默认不支持Thrift的打压测试
  • 需要本地安装,并且配置复杂
  • 对于用户操作并不友好

Jmeter

twitter/iago

iago 是一个由Twitter开源的压测工具,支持对HTTP、Thrift等服务进行压测,其主要问题如下:

  • 对每个压测应用都需要创建一个项目
  • 压测结果并不直观
  • 流量重放依赖本地文件
  • 项目依赖于一个较老版本的Scala,搭建不便
  • 相关文档比较少

除此之外,当时还考察了 Gatling、 Grinder、 Locust 等一些常见的压测工具,都因为适用场景和美团的需求有些出入而排除了。

综上,针对当前压测工具的一些现状,构建一个简单易用的压测工具还是很有必要的。

目标

针对之前提到的痛点,新的压测工具主要提供以下功能:

  • 线上流量拷贝
  • 简单易用的操作界面(接入压测的时间应该控制在1小时以内)
  • 清晰的图表能反映压测应用的各项指标
  • 满足包括Thrift、HTTP等服务的压测需求

如何构建

抽象

目标已经明确,怎么实现呢?首先是抽象压测的过程。 
一个典型的压测过程如图所示,首先在init方法里面,进行一些初始化的工作,比如连接数据库,创建客户端等。接下来,在run方法里面发出压测请求,为了保证能够对服务产生足够的压力,这里通常采用多线程并发访问,同时记录每次请求的发起时间和结束时间,这两个时间的简单相减就能够得到每次请求的响应时间,利用该结果就可以计算出TP90、平均响应时间、最大响应时间等指标,等压测结束后,通过destroy方法进行资源回收等工作。

Model

以上过程可以用接口表示,无论是压测Thrift服务还是HTTP服务,本质上都是这三个方法实现的不同。考虑到压测工具的灵活性和通用性,压测工具可以将这个接口交给打压测试的同学实现,而压测工具则重点实现多线程打压,打压结果的聚合等比较耗时的工作。

  interface Runner {
    def init(Test app) // 初始化压测
    def run(Test app, String log) // 每次打压请求,传入log方便构建请求
    def destroy(Test app) // 压测完毕后,回收资源
}

拷贝流量

Thrift服务打压的难点之一就是如何简单地拷贝线上真实流量用来构建打压请求。一些大型的Thrift服务数据结构非常复杂,写打压脚本的时候需要很多代码来解析日志,而且容易出错。 因此提供一个简单好用的拷贝流量方法是十分有必要的。

在这里压测工具提供了一个叫VCR(录像机)的工具来拷贝流量。VCR能够将线上的请求序列化后写到Redis里面。

考虑到用户需要查看具体请求和易用性等需求,最终选取了JSON格式作为序列化和反序列化的协议。同时需要部署在生产环境,为了降低对线上服务的影响,这里采取了单线程异步写的方式来拷贝流量。

VCR

聚合数据

应用打压完成后,需要一些指标来评估压测结果,常见的指标有:

  • 最大响应时间
  • 平均响应时间
  • QPS
  • TP90
  • TP50

压测工具采用了 InfluxDB 来完成数据的聚合工作。 
以TP90为例子,仅需要一行查询就能实现需求。

  SELECT PERCENTILE(response_time, 90) FROM test_series GROUP BY time(10s)

架构

整体而言,整个打压过程如下:

Loading Test

实践

拷贝流量

美团内部的服务大多使用Java来构建,VCR以Maven Package的方式提供给用户。

对用户来说只需要2行代码可以拷贝流量。

为了不影响线上服务,通常选取单台机器进行流量拷贝工作。

  
public class TestAppRPC implements TestApp.Iface {

    private Vcr _vcr = new Vcr("testapp"); // 指定拷贝流量的key

    @Override
    public TestResponse echo(TestRequest req) throws TException {
        _vcr.copy(req); // 拷贝操作
        long start = System.currentTimeMillis();
        TestResponse response = new TestResponse();
        return response;
    }
}

一旦流量拷贝完成后,通过Web界面,用户能够查看日志的收集情况和单条日志的详情。 
vcr

压测逻辑实现

压测工具采用Groovy来进行编写。对每个应用来说,只需要实现 runner接口就可以实现对应用的打压。

  interface Runner {
    def init(Test app)
    def run(Test app, String log)
    def destroy(Test app)
}

以Thrift服务为例:

  
class TestServiceRunner implements Runner {

    RPCService.Client _client
    TTransport _transport;

    @Override
    def init(Test app) {
        def conf = app.config // 读取应用配置
        _transport = new TFramedTransport(new TSocket(conf.get("thrift_service_host") as String, conf.get("thrift_service_port") as int))
        TProtocol protocol = new TBinaryProtocol(_transport)
        _client = new RPCService.Client(protocol)
        _transport.open()
    }

    @Override
    def run(Test app, String log) {
        TestRequest req = Vcr.deSerialize(log, TestRequest.class) // 将拷贝流量反序列化
        _client.echo(req) // 发送请求
    }

    @Override
    def destroy(Test app) {
        _transport.close() // 关闭服务
    }
}

创建应用

实现以上接口后,就可以对应用进行打压了。

用户可以通过Web界面创建应用,除了必填配置以外,用户可以按照应用灵活配置。

vcr

性能指标

用户可以通过直观的图表来查看应用的各种性能指标。

result

结束语

压测工具上线以来,已经接入了20多个应用,完成数百次打压实验,现在应用的接入时间仅需要15~30分钟。保证了美团服务的稳定和节省了开发同学的时间,使大家告别了以往繁琐冗长的打压测试。

 

 

http://tech.meituan.com/

分享到:
评论

相关推荐

    TCP协议压测工具源代码

    5. **延迟与响应时间**:TCP压测工具会测量数据包从发送到接收的时间,以及应用层的响应时间,这些指标对于实时性要求高的应用非常重要。 6. **并发连接数**:压测工具能模拟大量并发连接,测试服务器在处理多连接...

    美团 iOS 客户端的构建思考与实践

    整体而言,美团在iOS客户端的构建实践涉及到了架构设计、开发流程优化、代码管理、质量保证等多个方面。文档中的内容不仅对于iOS开发人员有重要参考价值,对于其他移动应用开发者而言,也提供了许多可借鉴的经验和...

    美团风控系统构建.docx

    ### 美团风控系统构建的关键知识点 #### 一、美团业务形态与面临的挑战 - **业务形态**:从最初的团购模式发展至涵盖餐饮、综合服务、电影票务、外卖配送、酒店预订及旅游服务等多个垂直领域的综合性电商平台。 - ...

    一个.NET 6开发的轻量级Web应用程序压测工具

    LoadTestToolbox的源码可以帮助开发者深入理解压力测试的实现细节,学习如何利用.NET 6框架构建类似工具。源码中可能包括以下几个关键部分: 1. **请求生成器**:用于构造HTTP请求并发送到目标Web服务器。 2. **负载...

    美团多渠道打包

    2. **获取工具**:从提供的"ProtectedApkResignerForWalle-master"压缩包中解压,这应该是美团多渠道打包工具的源码或者可执行文件。 3. **配置渠道信息**:创建一个包含所有渠道名的文本文件,每个渠道名占一行。...

    美团精选合辑——前端系列1

    【前端篇】 ...这些内容展示了美团在前端技术领域的深度探索和实践经验,涉及到了前端框架、移动开发、日志管理、性能优化、组件化、持续集成等多个方面,体现了其在技术创新和工程实践上的专业水平。

    美团点评深度解析:美团的战略、战术和能力圈

    美团点评是中国领先的生活服务电子商务平台,提供包括餐饮外卖、酒店旅游、电影票务、到店餐饮、共享单车、生鲜零售等多样化服务。本报告深入分析了美团点评的业务发展战略、战术布局以及其能力圈,以帮助投资者和...

    仿美团商品列表展示购物车

    在IT行业中,构建一个类似美团的商品列表展示及购物车功能是一项常见的需求,它涉及到前端界面设计、数据管理以及用户交互等多个方面。以下是对这个主题的详细解析: 首先,"商品列表展示"是电商网站的核心部分,它...

    美团免登接口

    1. **接口使用指南**:文档会详细说明如何集成美团的免登接口,包括请求和响应的格式、请求的URL、必要的参数设置等。开发者需要按照指南配置自己的应用程序,以调用接口并处理返回的结果。 2. **参数加密机制**:...

    美团2018年货前端技术

    从iOS覆盖率检测原理与增量代码测试覆盖率工具的实现,到iOS系统中导航栏转场解决方案与最佳实践,都展示了美团在iOS应用开发和性能优化上的深入研究。 美团在前端技术上不仅限于传统的Web和移动端应用,还包括了与...

    美团2018技术-后端.zip

    1. **系统架构**:可能会讨论到美团如何构建大规模、高并发的后端系统,包括微服务架构、分布式服务治理、数据库分库分表策略等。 2. **技术选型**:美团可能会分享他们在后端开发中选择的技术栈,如编程语言(Java...

    美团点评_W3690.HK再看美团:本地生活羽翼渐丰,生态构建迈征程.rar

    《美团点评_W3690.HK再看美团:本地生活羽翼渐丰,生态构建迈征程》 这篇报告深入探讨了美团点评的发展历程、业务布局以及未来战略方向,尤其聚焦于美团在本地生活服务领域的成就和生态系统的构建。美团点评,作为...

    仿美团外卖-微信小程序源码.zip

    2. **源码导入文档教程.docx** - 另一个Word文档,专门指导用户如何将源码导入到开发环境中,可能涵盖了微信开发者工具的使用、项目的初始化设置、以及如何运行和调试代码等内容。 3. **源码导入视频教程.mp4** - ...

    美团外卖源码

    通过分析这些页面的WXML和WXSS文件,我们可以学习到如何使用小程序的原生组件(如view、button、image等)构建UI,以及如何运用CSS样式来实现布局和美化。 3. **数据交互逻辑**: 在index.js等脚本文件中,可以...

    AndroidStudio-实战演练-仿美团外卖菜单全部代码,加图片资源

    它提供了丰富的工具集,包括代码编辑器、调试器、构建工具等,以帮助开发者高效地创建和管理Android应用。 2. **实战演练**: 这意味着该项目不仅是一个理论概念的展示,而是实际操作的练习,通过编写代码来模拟美团...

    美团网站 学员源代码

    【美团网站 学员源代码】是一份由杰出学员编写的源代码集合,它揭示了在构建类似美团这样的在线服务平台时所需的技术栈和设计思路。这份压缩包文件名为"meituan pro",暗示其中可能包含了针对美团业务的高级或专业版...

    前端项目-美团首页

    【前端项目-美团首页】是一个专注于构建美团网站首页的前端工程。这个项目旨在模拟和实现美团网站的主页功能,提供用户友好的界面和流畅的用户体验。通过下载并解压提供的压缩包,用户可以直接在浏览器中打开`index....

Global site tag (gtag.js) - Google Analytics