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

能否通过Gatling测试非REST流程的SQS消息发送代码?

可以用Gatling完成SQS消息发送的性能测试

完全可以用Gatling实现这类非HTTP协议的性能测试,核心思路是利用Gatling的自定义Action能力,结合AWS SDK for SQS来封装消息发送逻辑。以下是具体实现方案:

1. 依赖准备

确保项目中引入Gatling Java API和AWS SQS SDK的依赖(以Maven为例):

<dependencies>
    <dependency>
        <groupId>io.gatling</groupId>
        <artifactId>gatling-java</artifactId>
        <version>3.9.5</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>software.amazon.awssdk</groupId>
        <artifactId>sqs</artifactId>
        <version>2.20.100</version>
    </dependency>
</dependencies>

2. 复用SQS客户端

为避免频繁创建客户端带来的性能开销,建议全局复用一个SQS客户端实例:

import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.sqs.SqsClient;

public class SqsClientSingleton {
    private static final SqsClient INSTANCE;

    static {
        INSTANCE = SqsClient.builder()
                .region(Region.US_EAST_1) // 替换为你的队列所在区域
                .build();
    }

    public static SqsClient getInstance() {
        return INSTANCE;
    }
}

3. 编写Gatling模拟脚本

通过自定义Action实现SQS消息发送,并配置负载模型:

import io.gatling.javaapi.core.*;
import software.amazon.awssdk.services.sqs.model.SendMessageRequest;

import static io.gatling.javaapi.core.CoreDsl.*;

public class SqsLoadTest extends Simulation {
    private final SqsClient sqsClient = SqsClientSingleton.getInstance();
    private final String targetQueueUrl = "https://sqs.us-east-1.amazonaws.com/123456789012/your-target-queue"; // 替换为你的队列URL

    // 封装SQS消息发送动作
    private ActionBuilder sendSqsMessage() {
        return exec(session -> {
            // 生成动态消息内容(可从数据源读取,比如CSV)
            String messageContent = "Performance test message - User: " + session.userId() + ", Seq: " + session("repeatCount").asInt();
            
            SendMessageRequest request = SendMessageRequest.builder()
                    .queueUrl(targetQueueUrl)
                    .messageBody(messageContent)
                    // 可选:设置消息属性、延迟等
                    .build();

            try {
                var response = sqsClient.sendMessage(request);
                // 将消息ID存入session,用于后续验证或统计
                return session.set("sqsMessageId", response.messageId()).markAsSucceeded();
            } catch (Exception e) {
                // 标记请求失败并记录错误信息
                return session.set("errorMsg", e.getMessage()).markAsFailed();
            }
        }).name("Send SQS Message");
    }

    // 定义测试场景:每个虚拟用户发送10条消息
    private ScenarioBuilder sqsSenderScenario = scenario("SQS High Volume Sender")
            .repeat(10)
                .on(sendSqsMessage());

    // 配置负载策略
    {
        setUp(
            sqsSenderScenario.injectOpen(
                rampUsersPerSec(5).to(200).during(60), // 1分钟内从5到200用户/秒递增
                constantUsersPerSec(200).during(300) // 稳定200用户/秒运行5分钟
            )
        ).assertions(
            global().successfulRequests().percent().gte(99.9), // 断言成功率至少99.9%
            details("Send SQS Message").responseTime().percentile95().lt(500) // 断言95%请求响应时间小于500ms
        );
    }
}

关键注意事项

  • 客户端复用:必须全局复用SQS客户端,否则会耗尽连接资源,导致测试结果失真。
  • 动态数据:可以用Gatling的feed(csv("message-data.csv"))方法从CSV文件加载真实业务消息内容,模拟更贴近生产的场景。
  • 错误处理:捕获发送过程中的异常并标记请求失败,确保Gatling的统计数据准确。
  • 权限配置:运行测试的环境需要具备SQS队列的sqs:SendMessage权限,可通过IAM角色或本地AWS凭证配置实现。
  • 指标监控:Gatling会自动生成详细的测试报告,包含消息发送成功率、响应时间分布、吞吐量等核心指标,可直接用于性能分析。

内容的提问来源于stack exchange,提问作者colmulhall

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 16:02:45