news 2026/10/16 12:23:51

接口测试实战:Postman与JMeter从调试到压测的协同指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
接口测试实战:Postman与JMeter从调试到压测的协同指南

做接口测试或者性能验证的这行干久了,你会发现一个规律:不管项目用什么技术栈,前后端联调、接口回归、压测评估,最后绕不开的两个工具就是Postman和JMeter。一个管功能验证和调试,一个管并发和容量评估,配合起来几乎能覆盖日常绝大部分接口测试工作。

这篇内容不打算做那种菜单级别的功能罗列,而是把这两个工具真正干活的那套逻辑讲透:Postman怎么从调试器升级成自动化回归脚本,JMeter怎么从简单的请求工具变成能模拟真实用户并发的压测引擎,以及两者搭配使用时那些容易踩的坑。适合刚接触接口测试的开发者,也适合已经用了很久但想系统梳理一遍测试思路的工程师。

1. 工具定位与现实选择:为什么偏偏是这两款

1.1 Postman是接口调试的日常主力

Postman最核心的价值不是“能发请求”,而是把一次性的调试动作沉淀成可复用的资产。很多人用Postman就是填个URL、点Send、看返回,这其实只用了它不到两成的能力。

真正高效的使用方式是这样的:把项目相关的接口按模块拆分成Collection,每个请求配置好Headers、Body、Params,然后用环境变量管理不同环境下的域名和鉴权信息。这样一来,前端还没开始开发,后端接口只要联调过一遍,测试人员就能把整套接口用例沉淀下来,后续每次版本迭代,直接跑一遍Collection Runner,就能快速判断哪些接口被改挂了。

Postman的脚本能力是它区别于普通HTTP工具的关键。Pre-request Script和Tests脚本都基于JavaScript,虽然不像专门的编程环境那么强大,但足够应对日常接口测试中90%的场景。举个例子,接口需要token鉴权,你可以在Tests里把登录接口返回的access_token写入环境变量,然后同集合内的其他接口自动引用这个变量,整个流程就串起来了。

对于个人使用来说,Postman的学习曲线几乎是平的,下载安装、填URL、看返回,三分钟就能上手。这也是为什么它成了很多人接触接口测试的起点。但Postman的局限性也很明显:它在技术上更适合做请求验证,而不是高并发场景。虽然Runner和Newman能实现接口回归,但要想模拟几百上千个用户同时操作,Postman就力不从心了。

1.2 JMeter是性能与复杂场景的压测平台

JMeter和Postman的定位差异,从名字就能看出来。它最初是为负载测试设计的,核心模型是线程组,一个线程模拟一个用户,线程数乘以循环次数,就是你能发起的请求总量。这种线程模型决定了它天然适合做并发测试和数据驱动测试。

JMeter的核心优势有几个。第一,元件化设计。你可以在测试计划里自由组合线程组、Sampler、断言、监听器、配置元件,把复杂的业务压测场景拆解成可复用的模块。第二,它本身是Java实现的,跨平台能力强,命令行模式支持得也很好,可以直接挂到持续集成流水线上做定时压测。第三,它的生态非常成熟,插件丰富,比如通过JMeter插件管理器可以安装额外监听器、线程组扩展等,能满足很多冷门需求。

在真实的项目实践中,JMeter最常用的场景是这些:对新接口做单接口容量测试,看它的最大吞吐量和响应时间拐点;对完整业务链路做混合场景压测,模拟用户登录、查询、下单、支付等不同比例的操作;还有稳定性测试,长时间跑一晚上,看内存是否泄漏、慢请求是否增加。

但是JMeter的门槛明显比Postman高。主要是上手成本,光理解线程组、计数器、关联提取这一堆概念,就能劝退不少人。再加上它默认的界面比较老派,结果图表也不够美观。可一旦你用它跑出一份真实的压测报告,那种价值感是Postman完全给不了的。

1.3 什么时候用哪个,组合策略

在同一个项目中,这两个工具不是二选一的关系,而是分工协作。我个人的习惯是这样的:

接口刚开发出来,先用Postman做单接口调试,验证参数、头部、返回结构,确认功能正确后,把用例沉淀到集合里,配上环境变量和断言,跑通接口回归脚本。这一步的目标是保证接口“功能是好的”。然后当需要评估接口能不能扛住线上流量、性能瓶颈在哪个环节的时候,切换到JMeter,按业务比例设计场景,跑一轮压力测试,得到吞吐量和响应耗时趋势。这一步的目标是验证接口“扛不扛得住”。

两者之间还有一个衔接点:Postman调的请求日志(比如从控制台复制的HTTP请求格式),可以作为JMeter脚本设计的参考。甚至JMeter里可以用“HTTP请求默认值”来统一管理协议、域名、端口,这和Postman的环境变量思想是相通的,理解了其中一个,另外一个也就顺了。

2. Postman核心功能拆解与实操要点

2.1 集合、环境变量与请求编写的正确打开方式

所谓集合,其实就是一个按用途组织的请求文件夹。你可以按模块分,比如“用户模块”“订单模块”,也可以按业务链路分,比如“登录流程”、“下单流程”。每个请求都保存在集合内,之后不管是手工重放、批量执行、还是转成文档分享,都以集合为基本单位。

我建议从一开始就养成分层习惯:目录结构按接口版本或业务域组织,请求命名统一为“接口名-操作-场景”。走到团队协作阶段,这个习惯能省很多沟通成本。

请求编写核心有三块。第一块是Params,针对GET请求的查询参数,直接在UI里增删一目了然,不用手动拼URL。第二块是Body,POST请求用的多,常见格式有form-data、x-www-form-urlencoded、raw的JSON。这里有一个常见坑:form-data适合文件上传,但模拟普通表单提交时,有些后端框架接收参数的方式不同,需要确认你要的是form-data还是urlencoded。第三块是Headers,鉴权令牌、Content-Type、自定义TraceId都在这里加。

关于环境变量,强烈建议至少要配三套:本地开发环境、测试环境、预发布环境。每个环境对应一个域名前缀或完整BaseUrl。然后在请求URL里用模板变量引用,比如{{baseUrl}}/api/login。这样切环境只需要改当前活跃环境,不需要挨个改请求。

变量的生效逻辑值得注意:环境变量优先级高于全局变量,集合级变量可以在请求模板里直接引用,但脚本写入时最稳妥的写法是pm.environment.set(),然后使用的时候用pm.variables.get()。如果你发现脚本设置变量成功、但请求里拿不到,常见原因是当前环境没激活,或者变量设置的位置在请求发送之后。

2.2 断言、脚本提取与鉴权流程自动化

接口测试能把“人手点一遍”变成“自动化跑一遍”,靠的就是Tests脚本里的断言逻辑。Postman的断言API设计得比较直接用,比如下面这几条最常用的。

pm.test("状态码为200", function () { pm.response.to.have.status(200); }); pm.test("返回中的code字段为0", function () { var jsonData = pm.response.json(); pm.expect(jsonData.code).to.eql(0); }); pm.test("响应时间小于300ms", function () { pm.expect(pm.response.responseTime).to.be.below(300); });

三条断言分别覆盖了响应状态、业务码和性能指标。在实际项目中,状态码200只是最基础的一关,大量接口的错误信息是通过业务码返回的,所以第二种类断言往往更关键。

还有一类更进阶的用法,在Tests脚本中做数据传递,解决接口依赖问题。最经典的场景是登录后拿token,再带着token访问业务接口。这个流程可以这样拆:

第一步,在登录请求的Tests里提取token并保存。

var jsonData = pm.response.json(); var token = jsonData.data.access_token; pm.environment.set("token", token);

第二步,业务接口的Headers里加Authorization: Bearer {{token}},Postman会自动完成变量替换。

这里有个容易忽视的细节:登录接口返回结构一旦变化,token提取失败会导致后续所有关联接口报401。建议在提取前先用断言确认返回结构符合预期,然后在环境变量里设定默认值,保证集合直接执行时不会因为变量不存在而报错。

Pre-request Script同样能发挥很大价值,比如在某些接口需要RequestId或时间戳参数的场景,可以在请求前动态生成随机数填充参数。

pm.environment.set("timestamp", Date.now()); pm.environment.set("nonce", Math.random().toString(36).substring(2));

这个思路用一句话总结就是:在请求发出前准备好所有参数,发出后立即验证结果、数据直接喂给后续请求。

2.3 Runner批量执行与数据驱动回归

单接口调试再熟练,也只是Postman的起点。真正能解放时间的,是集合批量执行和测试数据文件驱动。

Runner界面里你能选择要执行的Collection或Folder、执行顺序、数据文件和迭代次数。最简单用法是勾选一个集合,设置迭代次数为1,跑一遍看状态码。实际项目中,我会用CSV文件来做数据驱动,例如批量创建用户时,每条数据是一组账号密码和期望返回码,Runner每次迭代读取一行,配合请求参数里的{{username}}、{{password}}变量,就能在一分钟内跑完几十个用户创建用例。

CSV文件和数据字段的对应关系要在请求模板变量里保持一致,第一行通常是字段名。

username,password,expectCode testuser1,123456,0 testuser2,123456,1001

Runner跑完后会同步展示测试通过/失败数量、断言结果和请求耗时。失败用例直接从结果列表点进去,能看到请求和响应的完整内容。结合环境变量和Tests断言,等于拥有了一条轻量级的接口回归流水线。

如果项目已经接入了持续集成,Postman还提供了Newman命令行工具,可以让你在终端直接执行集合,支持用--environment传入环境文件,用--data指定测试数据,配合--reporters junit生成JUnit格式报告。这样就不依赖图形界面,定时任务和流水线都能直接调。

3. JMeter核心概念与测试计划搭建

3.1 线程组、Sampler与常用元件的角色关系

第一次打开JMeter的人,多半会对着左边的树形结构发懵。这其实是一个层次分明的组件模型,理解它比记任何一个菜单按钮都重要。

测试计划是最顶层容器,代表一个完整的压测工程。向下挂线程组,线程组定义并发用户数和循环行为,是压测的起点。线程组下面挂Sampler,代表发出去的请求类型,最常用的是HTTP请求。再往下,你可以挂元件来增强或控制行为:配置元件负责提供变量、CSV数据和默认连接参数;断言用来校验响应结果;定时器用来模拟用户思考时间,控制请求频率;监听器负责收集和展示测试结果。

用一句话串起来:线程组模拟用户,Sampler发送请求,断言判断对错,监听器记录结果,配置元件提供数据。

实际开发中,线程组的参数设置是最常被问到的。线程数就是并发用户数;Ramp-Up Period意味着多长时间内启动所有线程,假设设置50个线程、5秒启动,JMeter会每秒增加10个线程;循环次数表示每个线程发多少次请求,如果勾选“永远”,测试会一直跑直到手动停止。这三个参数决定了压测的整体压力模型,不是随便填写的。

举个例子,线上业务高峰期大概是每秒有100个活跃用户,那我会设置线程数100,Ramp-Up 20秒,模拟用户在20分钟内慢慢上线,循环次数设为10分钟能完成的量,再加一个持续时间更稳定的方式:勾选调度器配置持续时间。这样得到的吞吐量趋势才相对符合真实情况。

3.2 参数化、关联与业务逻辑模拟

JMeter的参数化通常会用到CSV Data Set Config。这个组件能让你把每条测试数据逐行读取并放入变量,对新用户注册、批量查询这类场景特别合适。

配置上要注意几个关键点:Allow quoted data表示是否允许CSV里带引号,Recycle on EOF控制文件读完是否从头开始,Stop thread on EOF在没有数据可读时要不要结束线程。实际压测时,我通常会勾选Recycle on EOF,因为并发场景下线程数往往会超过测试数据行数,如果停掉线程,后面的场景就跑不起来了。

关联是更核心的技能。它的本质是“从上一个请求的响应中提取动态值,传给下一个请求”。最常见的场景是JMeter中先登录,从响应中提取token,再拼接到查询接口的请求头里。

直接用正则表达式提取,原理简单,但JSON响应格式稍微复杂就容易写错,例如:

"access_token":"([^"]+)"

这种方式在JMeter的后置处理器“正则表达式提取器”里很常用。匹配模板填$1$,意思是拿第一个括号捕获的内容。因为多数登录接口都返回的是JSON,JSON Extractor其实更实用,比如表达式$.data.access_token直接按路径取值,理解起来更直观。

提取完变量后,业务接口里用${token}引用,HTTP Header Manager里添加Authorization: Bearer ${token},就能把登录态串起来。

加上逻辑控制器之后,JMeter能模拟的不只是单接口,而是一条完整的用户行为链路。事务控制器可以把一个流程内的多个请求聚合为一项统计;如果业务比例不同,还可以用Switch控制器、权重方式实现不同接口的流量配比。

3.3 监听器与结果分析的正确读数

压测跑完看结果,是JMeter最容易被误读的环节。很多人只要看到“Average响应时间正常”就以为没问题,这其实远远不够。

常用监听器有两个:查看结果树是在压测过程中定位单条请求成功或失败用的,当你发现报错率上升时,点开错误请求,可以确定是超时、连接重置,还是服务端返回了异常数据结构;聚合报告则是宏观视角,它记录了样本数、平均值、中位数、90%/95%/99%响应时间、吞吐量、错误率。

要重点读几个指标:吞吐量(Requests/sec)是最直观的容量指标,代表系统每秒能处理多少个请求;错误率是这些请求里失败的比例;90%响应时间意味着九成请求在多少毫秒内完成,相比平均值更能说明真实体验,想象一下,平均耗时被少数慢请求拉高,平均线好看但很多体验已经很差,这时候中位数和90%线更有价值。

压测的原则是“先少后多、先快后慢”,先小线程数小循环把基线跑出来,再逐步加压力,找到系统从稳定到恶化的拐点,而不是一上来就1000并发把服务打崩。

4. 完整实操案例:登录加业务接口的压测脚本跑通

4.1 场景准备与接口梳理

下面我用一个常见的业务链路来演示完整流程:模拟用户登录后获取token,再调用一个用户信息查询接口,查询操作依赖登录返回的token,同时测试用户数据来自CSV文件。整个过程先Postman验证,再JMeter压测。

待测接口假设是这样的:登录接口POST /api/login,请求体JSON包含username和password,正常返回{"code":0,"data":{"access_token":"xxx"}};查询接口GET /api/user/info,请求头带Authorization: Bearer xxx,返回用户基本信息。这是很典型的系统结构,几乎每个项目都有类似链路。

先准备CSV参数文件,包含字段用户名和密码:

username,password test001,123456 test002,123456 test003,123456

然后开始实战。

4.2 用Postman先做接口功能与断言验证

先在Postman里建一个集合“用户链路调试”,下面建两个请求。

登录请求的请求方法选POST,URL填测试环境域名加/api/login,Body选raw JSON,写入:

{ "username": "{{username}}", "password": "{{password}}" }

注意这里用了环境变量{{username}},所以需要用CSV数据驱动时,能把变量替换看到效果。不过单次调试时,可以在环境变量里先给用户名和密码设置默认值。

登录请求的Tests脚本这样写:

pm.test("登录接口返回业务成功", function () { var jsonData = pm.response.json(); pm.expect(jsonData.code).to.eql(0); }); if (pm.response.code === 200) { var jsonData = pm.response.json(); var token = jsonData.data.access_token; if (token) { pm.environment.set("token", token); } }

保存成功且环境变量生效后,业务请求直接设置Headers:

Authorization: Bearer {{token}}

业务请求的Tests添加一个断言:

pm.test("用户信息查询成功", function () { var jsonData = pm.response.json(); pm.expect(jsonData.code).to.eql(0); });

在Postman Runner里选择这个集合,数据文件选择准备好的CSV,迭代次数3,跑一遍。正常情况是三组用例全部通过,token也在多条请求之间正确传递,说明接口功能和脚本逻辑都没有问题。

4.3 迁移到JMeter搭建性能测试计划

功能没问题后,转到JMeter做压测。打开测试计划,右键添加线程组。

线程组配置建议:线程数50,Ramp-Up 10秒,循环次数100。这样总请求量是50*100=5000次,对查询类接口来说压力适中。如果你想要更稳定的固定时长测试,可以勾选调度器并填写持续时间,比如持续300秒。

线程组下添加“CSV Data Set Config”,配置文件名填CSV的绝对路径(也可以勾选相对路径但会把情况搞复杂),变量名称填username, password,分隔符逗号,允许引用数据勾选,Recycle on EOF勾选上,Stop thread on EOF保持默认false。

接着添加“HTTP请求默认值”,在服务器名称或IP里填被测域名或IP,协议填对应协议,端口按实际填写,这个组件的意义是统一维护公共信息。

登录请求用“HTTP请求”组件,路径为/api/login,Body Data写入:

{ "username": "${username}", "password": "${password}" }

注意Content-Type要以参数形式加到HTTP信息头管理器,因为很多后端框架对请求格式解析很严格,漏掉就可能返回415。

在登录请求下添加JSON Extractor,变量名称填token,JSON Path表达式填$.data.access_token,默认值填NOT_FOUND。这个默认值很重要,一旦提取失败,会话可以直接从后续响应里看出问题。

再在业务查询请求里用HTTP Header Manager,添加:

Authorization: Bearer ${token}

加入查询请求,路径为/api/user/info。这样整条链路就串联好了。

添加断言,登录和查询请求都加“响应断言”,响应文本里规定要包含"code":0,如果返回异常,断言会直接标记请求失败。监听器添加“聚合报告”和“查看结果树”,跑一轮后重点看聚合报告。

4.4 压测结果字段怎么看

跑完之后打开聚合报告,逐个字段梳理。样本数是总请求量,异常与错误标记失败数量,吞吐量是每秒请求数,平均值和中位数是响应时间分布。如果看到类似这样的数据:样本数5000,平均响应时间90ms,90%线150ms,错误率0.00%,说明当前压力下接口状态健康。如果错误率明显上升,点击查看结果树找红色样本,看返回体和响应头的详细信息。

压测不是跑一遍就算完事。我的建议是至少做三组梯度:30并发、50并发、80并发,分别记录每组的吞吐量和90%响应时间,横向对比后才能发现性能拐点在哪个区间。如果80并发时吞吐量不升反降、响应时间快速上升,说明系统已经进入过载区,这个数值区间正好是容量规划的参考依据。

5. 常见问题与排查技巧实录

5.1 Postman使用中的高频困惑与解法

脚本设置变量不生效。先确认当前环境是否处于激活状态,变量被写到了哪个环境;其次确认写入变量代码是在发送请求前还是响应之后,把引用变量的请求重新打开一次,确认URL、Headers里的模板变量名称拼写完全一致。最后用控制台执行一次可定位到具体代码报错。

Variable替换出错。如果发现{{token}}被原样发送到服务端,说明环境变量没有被正确定义或者当前环境失效。建议在请求的Variables区域临时设置一个默认值,同时检查环境文件是否有变量存在。

Runner数据文件失效。CSV文件第一行会被当作字段名,第二行起才是数据,变量引用需要和字段名完全一致,且不要有多余空格。文件编码建议使用UTF-8,否则中文数据大概率乱码。跑完失败想定位时,直接在Runner失败项点开看到具体请求信息,来判断是数据问题还是断言写错了。

脚本里读取不到响应字段。先确认返回内容是不是JSON格式,有些接口在异常时返回的是HTML或纯文本,用pm.response.json()就会抛异常。稳妥的做法是先判断Content-Type,再有条件地解析并断言。

5.2 JMeter运行中的典型问题与避坑

脚本报“Try again”或连接失败。优先检查HTTP请求默认值里的协议和端口;然后是HTTPS域名是否配置了证书,压测环境如果用的是自签证书,要么把证书导入JMeter的truststore,要么在JMeter启动参数里信任所有证书,否则会一直握手失败。

正则提取器一个变量都取不到。先确认响应体确实是预期的内容,可以加一个“调试取样器”把提取出的变量全部打出来。若还是空的,检查表达式引号和中括号是否与内容完全匹配,推荐改用JSON Extractor,实现简洁也不容易出错。

高并发下token失效或覆盖。每个线程应该拿到独立的登录token,但如果你用“设置属性”之类的全局函数保存变量,所有线程都会读到最后一个值,等于所有请求用同一个token去访问,一旦token过期或服务端鉴权去重,就会大量失败。正确做法是用后置处理器把token保存为JMeter变量,它的作用域仅在当前线程内,每个线程各自维护一套会话状态。

压测跑久了内存溢出。JMeter默认启动内存往往不够用,跑长时间的稳定性测试,堆内存不够就会频繁GC甚至OOM。修改bin目录下的JMeter.bat或jmeter脚本中的HEAP参数,例如设置足够的内存后重新启动。命令行压测时不要加jmeter.sh参数,直接用-n -t,可以再加-l保存结果日志,比GUI模式稳定得多。

查看结果树数据量太大。大压测下保留“查看结果树”会疯狂占用内存,建议压测过程只保留聚合报告,需要样本明细时再单独开短时间小规模测试。

5.3 排查问题速查表

现象可能原因首选排查路径
响应提示401token未提取或已失效查看登录请求后续处理器、Header引用
响应提示415未设置Content-Type或类型不对检查HTTP信息头管理器
变量值始终为空提取器表达式错误用调试取样器打印变量
高并发错误率上升token共享导致鉴权失效或压力过大把token保存改为JMeter变量
吞吐量反而下降达到性能拐点或客户端瓶颈增加梯度测试确认拐点
JMeter卡顿GUI模式压测消耗资源切命令行模式并调大堆内存

6. 工具协同与经验心得

Postman和JMeter结合用,最核心的价值不是“会用某个功能”,而是建立起一套可重复的验证流程。接口开发完,先用Postman做功能验证和用例沉淀;接口验证通过,再用JMeter做性能测试和容量评估。两套脚本都留存好,以后每次改代码,先跑Postman回归功能,再跑JMeter看性能趋势是否劣化。

Postman里存下来的集合可以作为接口文档的补充,环境变量文件最好和项目配置同步维护。JMeter测试计划保存为jmx文件后,建议把CSV数据文件路径调整为相对路径或统一约定路径,这样换机器、换人协作时不用每回都改一遍。

我个人的体会是:刚开始学这两个工具时,容易钻进“某个按钮到底干什么”的细节里,反而忽略了一个核心目标——通过自动化验证和压力测试,持续确认系统交付质量。一旦从这个视角出发,选用什么工具就变得清晰:日常验证用Postman效率最高,性能容量验证用JMeter最合适,两者之间没有对立,而是同一套质量保障体系里的两个环节。

最后再分享一个习惯。每次压测前,我会先在Postman里把要压测的接口完整跑一遍,确认接口功能和鉴权都没问题,再进JMeter设计场景;跑完压测后,把聚合报告字段导出来存到项目文档里,作为后续比对的基线。这个习惯让我免于许多“脚本报错半天、最后发现是接口地址写错”的低效问题,也希望能帮你减少踩坑。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/16 12:22:29

PostgreSQL 18 io_method 不再玄学:用 strace 看穿 WAL 写入路径

说实话,PG 18 里这个io_method参数,我观察下来,很多 DBA 对它的态度基本分成两派。一派只看 Release Notes 和网上性能报告,觉得这是内核开发者才能理解的魔法;另一派直接上生产改配置,改完发现没效果甚至变…

作者头像 李华
网站建设 2026/10/16 12:17:46

Streamlit 集合项目实战:从 Python 脚本到交互式 Web 应用

简介:这份资源是面向Python开发者与数据可视化学习者的Streamlit实战项目合集,适合希望快速上手数据驱动Web应用、又不想深陷前端技术栈的工程师、分析师与学生。压缩包共7个文件,约518KB,以2个py脚本、3张jpg示例图片、1个txt依赖…

作者头像 李华
网站建设 2026/10/16 12:17:25

MySql进阶-SQl优化,视图

SQL优化一.插入优化二.主键优化(1)页分裂此时为主键乱序插入,50应该放在47后面,但如果47所在的页已经放不下50这个数据了,这时候mysql会创建一个新页并找到47所在页的50%的位置,把50%后的数据放在新页中&am…

作者头像 李华
网站建设 2026/10/16 12:12:04

FLAC转MP3全指南:编码参数、批处理与避坑实战

简介:FLAC转MP3大师 v7.0 是一套面向音频处理与多媒体格式转换场景的实用工具,主要帮助用户将 FLAC 无损音频转换为高品质 MP3 音乐,同时兼容 WMV、MP4、MOV、MPG、WAV、WMA 等常见音视频格式转 MP3 的需求,适合日常整理无损音乐、…

作者头像 李华
网站建设 2026/10/16 12:12:03

Cassandra Compaction策略选型:STCS、LCS与TWCS实战解析

打开你的Cassandra集群的 nodetool tablestatus ,看到某张表SSTable数量冲到几十甚至上百,后台compaction永远跟不上写入,查询慢得像在拖泥巴——这类问题十有八九不是硬件不行,而是当初建表时随手选错了compaction策略。 Cass…

作者头像 李华