我正在寻找解决方案,但我已经进行了各种配置,但未能获得满意的结果。
我需要做什么?队列取出 4 个 ID,将它们一一传递出去执行,等到队列上的任务结束或执行任务的时间超过,然后再取出下一个。
因此,我需要获取 4 个 id 的列表(我将从数据库下载它们,目前我通过写入列表中的 ID 来缩短条目),它们在队列中执行。首先,一个ID添加请求url,需要等待执行完成并返回响应。如果执行时间超过7分钟。这应该返回我http代码400。 最初,我希望整个测试最多持续 30 分钟。
这就是我的代码的样子:
import http from 'k6/http';
import { expect } from 'https://jslib.k6.io/k6chaijs/4.3.4.3/index.js';
import { check, sleep } from 'k6';
let idsParam = `
65056522
65056521
65056520
65056519
65056518
65056517
`;
let params = {
timeout: '780s',
};
export const optons = {
vus: 1,
timeout: '480s',
duration: '10m',
};
let data = idsParam.trim().split('\n').slice(1).map(row => row.trim());
export default async function () {
for (let id of data) {
let url = `https://pagequeue.com/task/{id}`;
console.info(`Request for ID ${id} `);
let res = await http.asyncRequest('GET', url, null, params);
// Wait until the request is processed
if (res.status != 200) {
console.warn(`Request for ID ${id} is still processing with status ${res.status}...`);
console.warn(res);
sleep(60);
}
// Check if the response status is 200 or 400, mark as failure otherwise
check(res, {
'Status is 200': (r) => r.status === 200,
});
// Check if the response status is 200 or 400, mark as failure otherwise
check(res, {
'Status is 400': (r) => r.status === 400,
});
expect(res.status).to.equal(200);
}
}
对于队列中最长 1 分钟的任务。它工作得很好,但是对于需要 3 分钟以上的请求,不要等待,而是使用 id 接受另一个请求。尽管增加了等待http请求异步响应的超时时间,但它对我不起作用,只有测试结束,尽管将时间设置为20分钟。 10m 30秒后结束。在队列端,服务准备返回 http 代码响应。 我在 jmeter 上检查了这一点,它在那里工作得很好。目前我需要使用我的k6来编写测试。谁能建议它应该是什么样子?
我找到了适合我的案例的解决方案。也许这对某人有用。我写的:
import http from 'k6/http';
import { check, sleep } from 'k6';
import { describe } from 'https://jslib.k6.io/k6chaijs/4.3.4.3/index.js';
let params = {
timeout: '420s'
};
let data = [1, 2, 3, 4, 5, 6];
export let options = {
vus: 1,
};
function sendRequest(id) {
return new Promise((resolve, reject) => {
let url = `https://pagequeue.com/task/${id}`;
let res = http.get(url, params);
let checkRes = check(res, {
'Status is 200': (r) => r.status === 200,
});
if (!checkRes) {
reject(`Request for ID ${id} failed with status ${res.status}`);
console.log('Response time was ' + String(res.timings.duration) + ' ms');
} else {
console.log(`Request for ID ${id} completed with status ${res.status}`);
console.log('Response time was ' + String(res.timings.duration) + ' ms');
resolve();
}
});
}
async function runQueue() {
for (const [index, id] of data.entries()) {
try {
await sendRequest(id);
continue;
} catch (error) {
console.warn(error);
}
}
}
export default function() {
describe('[Queue service] Run task from list by id', () => {
runQueue();
});
}
在顶部我添加了
params
,在哪里放置超时,我们等待完成请求多长时间。超时的默认值为 60 秒。