如何用JMeter创建测试多次触发SSE连接,验证BFF实例承载能力?
用JMeter测试SSE连接的实践方案
核心思路
SSE是基于HTTP的长连接,JMeter默认HTTP请求为短连接模式,无法维持SSE的持续监听状态,因此需要通过自定义Java Sampler来实现长连接的建立与事件读取逻辑。
具体实现步骤
1. 编写自定义SSE客户端Sampler
JMeter原生无专属SSE Sampler,需自行编写Java类实现SSE客户端核心逻辑:
- 核心逻辑:建立HTTP连接,设置
Accept: text/event-stream请求头,保持连接并持续读取服务器推送的事件,直到满足停止条件(如固定时长、指定事件数)。 - 示例代码片段:
import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient; import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext; import org.apache.jmeter.samplers.SampleResult; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; public class SSEClientSampler extends AbstractJavaSamplerClient { private HttpURLConnection connection; private BufferedReader reader; @Override public SampleResult runTest(JavaSamplerContext context) { SampleResult result = new SampleResult(); result.sampleStart(); try { URL url = new URL(context.getParameter("sseUrl")); connection = (HttpURLConnection) url.openConnection(); connection.setRequestProperty("Accept", "text/event-stream"); connection.setRequestProperty("Connection", "keep-alive"); connection.setReadTimeout(0); // 禁用读取超时,维持长连接 connection.connect(); reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); String line; // 持续读取SSE事件,这里设置监听30秒后停止 while ((line = reader.readLine()) != null && result.getDuration() < 30000) { if (line.startsWith("data:")) { result.setResponseData(line.getBytes()); } } result.setSuccessful(true); } catch (Exception e) { result.setSuccessful(false); result.setResponseMessage(e.getMessage()); } finally { try { if (reader != null) reader.close(); if (connection != null) connection.disconnect(); } catch (Exception ignored) {} result.sampleEnd(); } return result; } }
- 将编译后的类打包成JAR,放入JMeter的
lib/ext目录,重启JMeter后即可在「Java请求」组件中选择该Sampler。
2. 配置测试计划
- 线程组:设置线程数为5000(建议先从几百开始逐步递增,避免本地资源不足),循环次数设为1(每个线程对应一个独立SSE连接)。
- Java请求:选择自定义的
SSEClientSampler,配置sseUrl参数为目标BFF的SSE接口地址。 - 监听器:添加「聚合报告」统计成功率与响应指标,「查看结果树」用于调试,「线程数监听」实时监控并发连接数。
3. 关键性能优化
- JMeter JVM参数调整:修改
jmeter.bat/jmeter.sh中的堆内存配置,避免OOM:HEAP="-Xms4g -Xmx8g" - 连接池配置:在
bin/user.properties中调整HTTP连接池参数,确保支撑并发需求:httpclient.max_total=6000 httpclient.max_per_route=6000 - 分布式测试(可选):若单台JMeter资源不足,可采用分布式部署,多节点共同发起请求,避免本地CPU、网络成为瓶颈。
4. 核心监控指标
- 并发连接数:通过线程数监听确认是否达到目标5000个活跃连接。
- 连接成功率:从聚合报告中统计成功建立的SSE连接占比。
- BFF资源负载:同步监控BFF实例的CPU、内存、线程数、文件句柄数,定位服务器瓶颈。
- 事件接收延迟:在自定义Sampler中记录事件接收时间,统计延迟波动情况。
注意事项
- 测试前确认BFF的SSE配置(如最大连接数、超时时间),避免服务器主动断开连接。
- 采用逐步加压方式,从100、500、1000...递增到5000,观察每一步的服务器表现。
- 合理设置线程组的Ramp-Up时间(如60秒),让5000个线程逐步启动,避免瞬间压垮JMeter。
内容的提问来源于stack exchange,提问作者Caroline
相关产品推荐
相关产品推荐

