You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 07:05:25