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

k6异步请求队列处理:如何实现逐个等待响应再执行下一个请求

修正k6队列任务处理代码的问题

核心问题分析

你的代码存在几个关键错误,导致长耗时任务未正确等待、测试提前结束:

  1. 配置拼写错误:optons应该是options,这会导致你设置的duration等配置完全不生效,测试会遵循默认规则提前结束。
  2. URL模板未替换:{id}没有用模板语法替换为实际ID,请求的是错误的固定URL。
  3. 等待逻辑缺失:仅在收到非200状态时sleep60秒就推进到下一个任务,没有循环等待直到任务完成或超时。
  4. 超时配置不匹配需求:任务最长允许7分钟(420秒),但你设置的异步请求超时是780秒,测试总时长也未按需求设为30分钟。
  5. 断言逻辑错误:强制要求响应状态为200,但需求中任务超时应返回400,这会把合法的400判定为测试失败。

修正后的代码

import http from 'k6/http';
import { expect } from 'https://jslib.k6.io/k6chaijs/4.3.4.3/index.js';
import { check, sleep } from 'k6';

// 按需求处理4个目标任务ID
const targetIds = ['1', '2', '3', '4'];

// 任务最长允许执行时间:7分钟=420秒
const MAX_TASK_DURATION = 420;
// 轮询任务状态的间隔:60秒,可按需调整
const POLL_INTERVAL = 60;

const params = {
  timeout: `${MAX_TASK_DURATION}s`, // 异步请求超时匹配任务最长允许时间
};

export const options = {
  vus: 1,
  maxRedirects: 0,
  timeout: `${MAX_TASK_DURATION + 10}s`, // 单迭代超时略长于任务超时
  duration: '30m', // 测试总时长设为需求的30分钟
};

export default async function () {
  for (const id of targetIds) {
    const url = `https://pagequeue.com/task/${id}`;
    console.info(`开始处理任务ID: ${id}`);

    let res;
    let elapsedTime = 0;
    let isTaskCompleted = false;

    // 循环轮询直到任务完成或超时
    while (elapsedTime < MAX_TASK_DURATION) {
      res = await http.asyncRequest('GET', url, null, params);
      
      if (res.status === 200) {
        console.info(`任务ID ${id} 执行完成,耗时 ${elapsedTime}秒`);
        isTaskCompleted = true;
        break;
      } else if (res.status === 400) {
        console.warn(`任务ID ${id} 执行超时,返回400`);
        isTaskCompleted = true;
        break;
      } else {
        // 任务仍在处理中,等待后重试
        console.info(`任务ID ${id} 处理中,当前状态: ${res.status},已耗时 ${elapsedTime}秒,继续等待...`);
        sleep(POLL_INTERVAL);
        elapsedTime += POLL_INTERVAL;
      }
    }

    // 处理超时未完成的情况
    if (!isTaskCompleted) {
      console.error(`任务ID ${id} 超过最长允许时间(${MAX_TASK_DURATION}秒),强制标记为超时`);
      check({ status: 400 }, {
        '任务超时返回400': (r) => r.status === 400,
      });
      continue;
    }

    // 验证响应状态为合法的200或400
    check(res, {
      '响应状态合法': (r) => r.status === 200 || r.status === 400,
    });

    // 断言允许200(成功)和400(超时)两种状态
    expect(res.status).to.be.oneOf([200, 400]);
  }
}

关键修正点说明

  • 修正options拼写错误,确保测试时长、超时等配置正常生效。
  • 改用明确的目标ID数组,严格匹配需求的4个任务处理。
  • 实现循环轮询逻辑,持续检查任务状态直到完成或达到最长允许时间。
  • 对齐超时配置与需求:任务最长7分钟,测试总时长30分钟。
  • 调整断言逻辑,允许200(任务成功完成)和400(任务超时)两种合法状态。
  • 修复URL模板错误,正确替换ID参数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 20:53:20