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

如何使用K6测试DotNet WebAPI的限流规则是否生效

.NET WebAPI TokenBucketRateLimiter 限流验证方案

我为.NET WebAPI集成了TokenBucketRateLimiter限流组件,配置如下:

new TokenBucketRateLimiterOptions
{
    TokenLimit = 5,
    ReplenishmentPeriod = TimeSpan.FromSeconds(10),
    TokensPerPeriod = 2,
    QueueLimit = 0
});

需要验证:当5个初始令牌耗尽后,后续请求会返回HTTP 429状态码,直到10秒的令牌补充周期结束。目前我能编写基础k6脚本验证200状态,但不知道如何测试预期的429限流状态,现有脚本如下:

import { check } from 'k6'
import http from 'k6/http'

export let options = {
    insecureSkipTLSVerify: true,
    scenarios: {
        constant_request_rate: {
            executor: 'constant-arrival-rate',
            rate: 1,
            timeUnit: '2s', 
            duration: '10s',
            preAllocatedVUs: 1, 
            maxVUs: 1,
        },
    },
};

export default () => {
    let result = http.get(url, {
        headers: {
            'Authorization': 'Bearer ...'
        }
    });
    
    check(result, {
        'is status 200': (r) => r.status === 200
    });
};

修改后的k6测试脚本

要精准验证限流规则,需要调整测试场景的请求频率,确保快速耗尽令牌后持续发送请求验证429状态。以下是优化后的脚本:

import { check, sleep } from 'k6'
import http from 'k6/http'

// 替换为你的API实际地址
const url = 'https://your-api-target-endpoint';

export let options = {
    insecureSkipTLSVerify: true,
    scenarios: {
        // 阶段1:1秒内发5个请求,耗尽初始令牌
        consume_initial_tokens: {
            executor: 'constant-arrival-rate',
            rate: 5,
            timeUnit: '1s',
            duration: '1s',
            preAllocatedVUs: 5,
            maxVUs: 5,
        },
        // 阶段2:令牌补充前的9秒内,每秒发1个请求验证限流
        verify_rate_limit: {
            executor: 'constant-arrival-rate',
            rate: 1,
            timeUnit: '1s',
            duration: '9s',
            preAllocatedVUs: 1,
            maxVUs: 1,
            startTime: '1s', // 阶段1结束后立即启动
        },
    },
};

export default () => {
    const result = http.get(url, {
        headers: {
            'Authorization': 'Bearer your-valid-token' // 替换为有效授权令牌
        }
    });

    // 根据迭代次数区分阶段:前5次是令牌消耗阶段,后续是限流验证阶段
    const isConsumePhase = __ITER < 5;
    if (isConsumePhase) {
        check(result, {
            '[消耗阶段] 返回200 OK': (r) => r.status === 200
        });
    } else {
        check(result, {
            '[限流阶段] 返回429 Too Many Requests': (r) => r.status === 429
        });
        // 可选:验证Retry-After响应头(如果API返回的话)
        check(result, {
            '[限流阶段] Retry-After头存在且合理': (r) => r.headers['Retry-After'] !== undefined && parseInt(r.headers['Retry-After']) <= 10
        });
    }

    sleep(0.1);
};

脚本核心逻辑说明

  1. 双阶段场景设计

    • 第一阶段consume_initial_tokens:用5个VUs在1秒内发送5个请求,确保瞬间耗尽初始的5个令牌。
    • 第二阶段verify_rate_limit:在第一阶段结束后,连续9秒每秒发送1个请求,覆盖10秒补充周期内的未补充时段,验证限流触发。
  2. 状态码精准校验

    • 通过k6内置变量__ITER(当前迭代次数)判断请求所处阶段,前5次请求预期返回200,后续请求强制校验429状态码。
  3. 可选扩展验证

    • 可以添加第三阶段,在10秒补充周期结束后发送请求,验证令牌补充后是否恢复返回200,确认令牌 replenishment 机制正常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 02:25:32