6ebd435e81
* WIP execution concurrency controls implemented via Redis - Split up resuming a run and executing a run - Added some new statuses to better show what is going on in a run - Removed preprocessing runs * WIP * Convert to using ZSETs and adding env vars * Removed unused import * Improve run number generation using advistory locks, and only on start * More execution concurrency stuff * Add support for job concurrency limits and concurrency limit groups * Create wild-swans-battle.md * Increase slots refresh timeout to 10s * Try to fix Redis connection issues * Don’t be so strict about the APP_ENV * Add the blank tls option to the normal redis client as well * Add docs
203 lines
5.1 KiB
TypeScript
203 lines
5.1 KiB
TypeScript
import { triggerClient } from "./trigger";
|
|
|
|
async function sendEvent() {
|
|
try {
|
|
return await triggerClient.sendEvent({
|
|
name: "perf.test",
|
|
payload: {
|
|
string: "Hello, World!",
|
|
number: 42,
|
|
boolean: true,
|
|
nullValue: null,
|
|
array: [1, 2, 3],
|
|
object: {
|
|
nestedString: "Nested value",
|
|
nestedNumber: 3.14,
|
|
nestedArray: ["apple", "banana", "cherry"],
|
|
nestedObject: {
|
|
nestedBoolean: false,
|
|
nestedNull: null,
|
|
},
|
|
},
|
|
},
|
|
});
|
|
} catch (err) {
|
|
console.error(err);
|
|
}
|
|
}
|
|
|
|
async function sendEvents(count: number) {
|
|
const events = new Array(count).fill({
|
|
name: "perf.test",
|
|
payload: {
|
|
string: "Hello, World!",
|
|
number: 42,
|
|
boolean: true,
|
|
nullValue: null,
|
|
array: [1, 2, 3],
|
|
object: {
|
|
nestedString: "Nested value",
|
|
nestedNumber: 3.14,
|
|
nestedArray: ["apple", "banana", "cherry"],
|
|
nestedObject: {
|
|
nestedBoolean: false,
|
|
nestedNull: null,
|
|
},
|
|
},
|
|
},
|
|
});
|
|
try {
|
|
return await triggerClient.sendEvents(events);
|
|
} catch (err) {
|
|
console.error(err);
|
|
}
|
|
}
|
|
|
|
async function main() {
|
|
console.log("Preparing perf tests...");
|
|
|
|
// wait for 10 seconds
|
|
await new Promise((resolve) => setTimeout(resolve, 10000));
|
|
|
|
console.log("Starting perf tests in 1 second...");
|
|
|
|
// wait for 1 seconds
|
|
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
|
|
// Send 5 events per second for 30 seconds (1 event == 10 runs)
|
|
for (let i = 0; i < 30; i++) {
|
|
console.log("Sending 5 event...");
|
|
|
|
await sendEvent();
|
|
await sendEvent();
|
|
await sendEvent();
|
|
await sendEvent();
|
|
await sendEvent();
|
|
|
|
await new Promise((resolve) => setTimeout(resolve, 950));
|
|
}
|
|
|
|
// console.log("Sending 30 events...");
|
|
// for (let i = 0; i < 30; i++) {
|
|
// await sendEvent();
|
|
// }
|
|
}
|
|
|
|
async function mainParallel() {
|
|
const batches = 30;
|
|
const concurrentEvents = 5;
|
|
|
|
console.log("Preparing perf tests...");
|
|
|
|
// wait for 10 seconds
|
|
await new Promise((resolve) => setTimeout(resolve, 5000));
|
|
|
|
console.log("Starting perf tests in 1 second...");
|
|
|
|
// wait for 1 seconds
|
|
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
|
|
// Send 5 events per second for 30 seconds (1 event == 10 runs)
|
|
for (let i = 0; i < batches; i++) {
|
|
console.log(`Sending ${concurrentEvents} events... batch ${i + 1}/${batches}`);
|
|
await Promise.all(new Array(concurrentEvents).fill(0).map(sendEvent));
|
|
|
|
await new Promise((resolve) => setTimeout(resolve, 250));
|
|
}
|
|
}
|
|
|
|
async function mainParallelBulk() {
|
|
const batches = 1;
|
|
const concurrency = 10;
|
|
const eventsPer = 10;
|
|
|
|
console.log("Preparing perf tests...");
|
|
|
|
// wait for 10 seconds
|
|
await new Promise((resolve) => setTimeout(resolve, 5000));
|
|
|
|
console.log("Starting perf tests in 1 second...");
|
|
|
|
// wait for 1 seconds
|
|
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
|
|
// Send 5 events per second for 30 seconds (1 event == 10 runs)
|
|
for (let i = 0; i < batches; i++) {
|
|
console.log(`Sending ${concurrency} x ${eventsPer} events... batch ${i + 1}/${batches}`);
|
|
await Promise.all(new Array(concurrency).fill(0).map(() => sendEvents(eventsPer)));
|
|
|
|
await new Promise((resolve) => setTimeout(resolve, 250));
|
|
}
|
|
}
|
|
|
|
async function mainLong() {
|
|
console.log("Preparing long perf tests...");
|
|
|
|
// wait for 10 seconds
|
|
await new Promise((resolve) => setTimeout(resolve, 10000));
|
|
|
|
console.log("Starting long perf tests in 1 second...");
|
|
|
|
// wait for 1 seconds
|
|
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
|
|
// Send 1 events every 5 seconds for 30 minutes
|
|
for (let i = 0; i < 360; i++) {
|
|
console.log("Sending 1 events...");
|
|
|
|
await sendEvent();
|
|
|
|
await new Promise((resolve) => setTimeout(resolve, 5000));
|
|
}
|
|
}
|
|
|
|
async function mainSerial() {
|
|
console.log("Preparing serial perf tests...");
|
|
|
|
// wait for 10 seconds
|
|
await new Promise((resolve) => setTimeout(resolve, 10000));
|
|
|
|
console.log("Starting serial perf tests in 1 second...");
|
|
|
|
// wait for 1 seconds
|
|
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
|
|
// Send 25 events
|
|
for (let i = 0; i < 25; i++) {
|
|
await sendEvent();
|
|
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
}
|
|
}
|
|
|
|
async function mainConcurrency() {
|
|
const batches = 1;
|
|
const concurrency = 10;
|
|
const eventsPer = 5;
|
|
|
|
console.log("Preparing perf tests...");
|
|
|
|
await new Promise((resolve) => setTimeout(resolve, 5000));
|
|
|
|
console.log("Starting perf tests in 1 second...");
|
|
|
|
// wait for 1 seconds
|
|
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
|
|
// Send 5 events per second for 30 seconds (1 event == 10 runs)
|
|
for (let i = 0; i < batches; i++) {
|
|
console.log(`Sending ${concurrency} x ${eventsPer} events... batch ${i + 1}/${batches}`);
|
|
await Promise.all(new Array(concurrency).fill(0).map(() => sendEvents(eventsPer)));
|
|
|
|
await new Promise((resolve) => setTimeout(resolve, 250));
|
|
}
|
|
}
|
|
|
|
async function mainSingle() {
|
|
await sendEvent();
|
|
}
|
|
|
|
mainConcurrency().catch((err) => {
|
|
console.error(err);
|
|
process.exit(1);
|
|
});
|