redis-smq-benchmarks 9.0.9-next.1 → 9.0.9-next.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -0
- package/dist/esm/bin/cli.js +1 -1
- package/dist/esm/bin/cli.js.map +1 -1
- package/dist/esm/src/common/base-benchmark.d.ts +4 -16
- package/dist/esm/src/common/base-benchmark.d.ts.map +1 -1
- package/dist/esm/src/common/base-benchmark.js +14 -18
- package/dist/esm/src/common/base-benchmark.js.map +1 -1
- package/dist/esm/src/consumer-benchmark.d.ts.map +1 -1
- package/dist/esm/src/consumer-benchmark.js +9 -13
- package/dist/esm/src/consumer-benchmark.js.map +1 -1
- package/dist/esm/src/e2e-benchmark.d.ts.map +1 -1
- package/dist/esm/src/e2e-benchmark.js +36 -54
- package/dist/esm/src/e2e-benchmark.js.map +1 -1
- package/dist/esm/src/helpers/calculate-benchmark-result.d.ts +3 -0
- package/dist/esm/src/helpers/calculate-benchmark-result.d.ts.map +1 -0
- package/dist/esm/src/helpers/calculate-benchmark-result.js +16 -0
- package/dist/esm/src/helpers/calculate-benchmark-result.js.map +1 -0
- package/dist/esm/src/helpers/create-worker.d.ts +2 -2
- package/dist/esm/src/helpers/timing.d.ts +9 -0
- package/dist/esm/src/helpers/timing.d.ts.map +1 -0
- package/dist/esm/src/helpers/timing.js +29 -0
- package/dist/esm/src/helpers/timing.js.map +1 -0
- package/dist/esm/src/producer-benchmark.d.ts.map +1 -1
- package/dist/esm/src/producer-benchmark.js +9 -13
- package/dist/esm/src/producer-benchmark.js.map +1 -1
- package/dist/esm/src/threads/consumer-worker-thread.js +11 -8
- package/dist/esm/src/threads/consumer-worker-thread.js.map +1 -1
- package/dist/esm/src/threads/producer-worker-thread.js +7 -5
- package/dist/esm/src/threads/producer-worker-thread.js.map +1 -1
- package/dist/esm/src/types/index.d.ts +24 -14
- package/dist/esm/src/types/index.d.ts.map +1 -1
- package/package.json +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,20 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
## [9.0.9-next.3](https://github.com/weyoss/redis-smq/compare/v9.0.9-next.2...v9.0.9-next.3) (2026-01-09)
|
|
7
|
+
|
|
8
|
+
### ♻️ Code Refactoring
|
|
9
|
+
|
|
10
|
+
- **redis-smq-benchmarks:** improve throughput calculation and benchmark result reporting ([06c7f23](https://github.com/weyoss/redis-smq/commit/06c7f23987943a3993335fe19d612d2abebd5859))
|
|
11
|
+
- **redis-smq-benchmarks:** provide nanosecond-precision throughput measurements ([776f35a](https://github.com/weyoss/redis-smq/commit/776f35a583358b5799e2064f80fe17d067ed51a2))
|
|
12
|
+
- **redis-smq-benchmarks:** use strong typing for thread messages, clean up ([a74baf7](https://github.com/weyoss/redis-smq/commit/a74baf7de3bc63d15d52e656596a336336eb8e2d))
|
|
13
|
+
|
|
14
|
+
## [9.0.9-next.2](https://github.com/weyoss/redis-smq/compare/v9.0.9-next.1...v9.0.9-next.2) (2026-01-08)
|
|
15
|
+
|
|
16
|
+
### 🐛 Bug Fixes
|
|
17
|
+
|
|
18
|
+
- **redis-smq-benchmarks:** use correct redis config for non-dev environment ([8001b33](https://github.com/weyoss/redis-smq/commit/8001b33106130cd8495ca2cd7f66322726a8ec32))
|
|
19
|
+
|
|
6
20
|
## [9.0.9-next.1](https://github.com/weyoss/redis-smq/compare/v9.0.9-next.0...v9.0.9-next.1) (2026-01-08)
|
|
7
21
|
|
|
8
22
|
### 🐛 Bug Fixes
|
package/dist/esm/bin/cli.js
CHANGED
package/dist/esm/bin/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../../bin/cli.ts"],"names":[],"mappings":";AAWA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EACL,WAAW,EACX,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,KAAK,EACL,mBAAmB,EACnB,GAAG,EACH,kBAAkB,GAEnB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE1D,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,MAAM,SAAS,GAAG,GAAG,CAAC,aAAa,EAAE,CAAC;AACtC,MAAM,kBAAkB,GAAG,IAAI,CAAC,OAAO,CACrC,SAAS,EACT,0CAA0C,CAC3C,CAAC;AACF,MAAM,kBAAkB,GAAG,IAAI,CAAC,OAAO,CACrC,SAAS,EACT,0CAA0C,CAC3C,CAAC;AAGF,MAAM,EAAE,GAAG,cAAc,CAAC;AAC1B,MAAM,IAAI,GAAG,SAAS,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;AACnC,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,MAAM,CAAC,CAAC;AACnE,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAC5B,QAAQ,EACR,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,CAAC,CAAC,CACzC,CAAC;AACF,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAC5B,QAAQ,EACR,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,CAAC,CAAC,CACzC,CAAC;AACF,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,KAAK,GAAG,CAAC;AAG7D,MAAM,aAAa,GACjB,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa;IACtC,OAAO,CAAC,GAAG,CAAC,SAAS,KAAK,aAAa,CAAC;AAG1C,IAAI,cAAc,GAAiB,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../../bin/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,17 +1,7 @@
|
|
|
1
1
|
import { IQueueParams } from 'redis-smq';
|
|
2
2
|
import { ICallback, IRedisConfig } from 'redis-smq-common';
|
|
3
|
-
import {
|
|
3
|
+
import { IBenchmarkConfig, IBenchmarkResult, IWorkerCompleteMessage, TWorkerMessageHandler } from '../types/index.js';
|
|
4
4
|
import { Worker } from 'worker_threads';
|
|
5
|
-
export interface IWorkerMessage {
|
|
6
|
-
type: EWorkerMessageType;
|
|
7
|
-
data: {
|
|
8
|
-
workerId: number;
|
|
9
|
-
processed?: number;
|
|
10
|
-
timeTaken?: number;
|
|
11
|
-
expected?: number;
|
|
12
|
-
};
|
|
13
|
-
}
|
|
14
|
-
export type MessageHandler = (msg: IWorkerMessage) => void;
|
|
15
5
|
export declare abstract class BaseBenchmark {
|
|
16
6
|
protected showProgress: boolean;
|
|
17
7
|
protected redisConfig: IRedisConfig;
|
|
@@ -21,18 +11,16 @@ export declare abstract class BaseBenchmark {
|
|
|
21
11
|
protected workerPath: string;
|
|
22
12
|
protected workerLabel: string;
|
|
23
13
|
protected workers: Worker[];
|
|
14
|
+
protected workerResults: IWorkerCompleteMessage['data'][];
|
|
24
15
|
protected completedWorkers: number;
|
|
25
|
-
protected totalProcessed: number;
|
|
26
|
-
protected totalProcessingTime: number;
|
|
27
|
-
protected startTime: number;
|
|
28
16
|
constructor(config: IBenchmarkConfig);
|
|
29
17
|
protected abstract ensureQueue(): Promise<void> | void;
|
|
30
18
|
protected calculateMessageDistribution(): {
|
|
31
19
|
count: number;
|
|
32
20
|
remainder: number;
|
|
33
21
|
};
|
|
34
|
-
protected createMessageHandler(onComplete: (
|
|
35
|
-
protected createWorkers(onMessage:
|
|
22
|
+
protected createMessageHandler(onComplete: (r: IBenchmarkResult) => void): TWorkerMessageHandler;
|
|
23
|
+
protected createWorkers(onMessage: TWorkerMessageHandler): Promise<void>;
|
|
36
24
|
protected shutdownWorkers(): Promise<void>;
|
|
37
25
|
abstract run(cb: ICallback<IBenchmarkResult>): void;
|
|
38
26
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-benchmark.d.ts","sourceRoot":"","sources":["../../../../src/common/base-benchmark.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,
|
|
1
|
+
{"version":3,"file":"base-benchmark.d.ts","sourceRoot":"","sources":["../../../../src/common/base-benchmark.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAEL,gBAAgB,EAChB,gBAAgB,EAChB,sBAAsB,EAEtB,qBAAqB,EACtB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAKxC,8BAAsB,aAAa;IACjC,SAAS,CAAC,YAAY,UAAS;IAC/B,SAAS,CAAC,WAAW,EAAE,YAAY,CAAC;IACpC,SAAS,CAAC,KAAK,EAAE,YAAY,CAAC;IAC9B,SAAS,CAAC,aAAa,EAAE,MAAM,CAAC;IAChC,SAAS,CAAC,WAAW,EAAE,MAAM,CAAC;IAC9B,SAAS,CAAC,UAAU,EAAE,MAAM,CAAC;IAC7B,SAAS,CAAC,WAAW,EAAE,MAAM,CAAC;IAC9B,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,CAAM;IACjC,SAAS,CAAC,aAAa,EAAE,sBAAsB,CAAC,MAAM,CAAC,EAAE,CAAM;IAC/D,SAAS,CAAC,gBAAgB,SAAK;gBAEnB,MAAM,EAAE,gBAAgB;IAUpC,SAAS,CAAC,QAAQ,CAAC,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAEtD,SAAS,CAAC,4BAA4B,IAAI;QACxC,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,MAAM,CAAC;KACnB;IAMD,SAAS,CAAC,oBAAoB,CAC5B,UAAU,EAAE,CAAC,CAAC,EAAE,gBAAgB,KAAK,IAAI,GACxC,qBAAqB;cA+BR,aAAa,CAC3B,SAAS,EAAE,qBAAqB,GAC/B,OAAO,CAAC,IAAI,CAAC;cA8BA,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;aAShC,GAAG,CAAC,EAAE,EAAE,SAAS,CAAC,gBAAgB,CAAC,GAAG,IAAI;CAC3D"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { EWorkerMessageType, } from '../types/index.js';
|
|
2
2
|
import { createWorker } from '../helpers/create-worker.js';
|
|
3
|
+
import { HighResTimer } from '../helpers/timing.js';
|
|
4
|
+
import { calculateBenchmarkResult } from '../helpers/calculate-benchmark-result.js';
|
|
3
5
|
export class BaseBenchmark {
|
|
4
6
|
showProgress = false;
|
|
5
7
|
redisConfig;
|
|
@@ -9,10 +11,8 @@ export class BaseBenchmark {
|
|
|
9
11
|
workerPath;
|
|
10
12
|
workerLabel;
|
|
11
13
|
workers = [];
|
|
14
|
+
workerResults = [];
|
|
12
15
|
completedWorkers = 0;
|
|
13
|
-
totalProcessed = 0;
|
|
14
|
-
totalProcessingTime = 0;
|
|
15
|
-
startTime = 0;
|
|
16
16
|
constructor(config) {
|
|
17
17
|
this.redisConfig = config.redisConfig;
|
|
18
18
|
this.queue = config.queue;
|
|
@@ -31,31 +31,27 @@ export class BaseBenchmark {
|
|
|
31
31
|
return (msg) => {
|
|
32
32
|
if (msg.type === EWorkerMessageType.COMPLETED) {
|
|
33
33
|
this.completedWorkers++;
|
|
34
|
+
this.workerResults.push(msg.data);
|
|
34
35
|
const { workerId, processed, timeTaken } = msg.data;
|
|
35
|
-
this.
|
|
36
|
-
this.
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
total: this.totalProcessed,
|
|
44
|
-
workerCount: this.workerCount,
|
|
45
|
-
});
|
|
46
|
-
}
|
|
36
|
+
console.log(`${this.workerLabel} ${workerId} completed: ${processed} messages in ${HighResTimer.format(timeTaken)} (${(processed / HighResTimer.toSeconds(timeTaken)).toFixed(0)} msg/s)`);
|
|
37
|
+
if (this.completedWorkers === this.workerCount)
|
|
38
|
+
this.shutdownWorkers()
|
|
39
|
+
.then(() => {
|
|
40
|
+
const r = calculateBenchmarkResult(this.workerResults);
|
|
41
|
+
onComplete(r);
|
|
42
|
+
})
|
|
43
|
+
.catch(() => void 0);
|
|
47
44
|
}
|
|
48
45
|
else if (msg.type === EWorkerMessageType.PROGRESS &&
|
|
49
46
|
this.showProgress) {
|
|
50
|
-
const { workerId,
|
|
51
|
-
console.log(`${this.workerLabel} ${workerId} progress: ${
|
|
47
|
+
const { workerId, progress } = msg.data;
|
|
48
|
+
console.log(`${this.workerLabel} ${workerId} progress: ${progress} messages`);
|
|
52
49
|
}
|
|
53
50
|
};
|
|
54
51
|
}
|
|
55
52
|
async createWorkers(onMessage) {
|
|
56
53
|
const { count: messagesPerWorker, remainder: remainingMessages } = this.calculateMessageDistribution();
|
|
57
54
|
console.log(`Messages per ${this.workerLabel} (approx): ${messagesPerWorker}`);
|
|
58
|
-
this.startTime = Date.now();
|
|
59
55
|
for (let i = 0; i < this.workerCount; i++) {
|
|
60
56
|
let workerMessageCount = messagesPerWorker;
|
|
61
57
|
if (i < remainingMessages) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-benchmark.js","sourceRoot":"","sources":["../../../../src/common/base-benchmark.ts"],"names":[],"mappings":"AAWA,OAAO,EACL,kBAAkB,
|
|
1
|
+
{"version":3,"file":"base-benchmark.js","sourceRoot":"","sources":["../../../../src/common/base-benchmark.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"consumer-benchmark.d.ts","sourceRoot":"","sources":["../../../src/consumer-benchmark.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAGpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"consumer-benchmark.d.ts","sourceRoot":"","sources":["../../../src/consumer-benchmark.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAGpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAG3D,qBAAa,iBAAkB,SAAQ,aAAa;cAClC,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;cAS5B,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAStC,GAAG,CAAC,EAAE,EAAE,SAAS,CAAC,gBAAgB,CAAC,GAAG,IAAI;CAqClD"}
|
|
@@ -2,6 +2,7 @@ import { async } from 'redis-smq-common';
|
|
|
2
2
|
import { ensureQueue } from './helpers/ensure-queue.js';
|
|
3
3
|
import { prefillQueue } from './helpers/prefill-queue.js';
|
|
4
4
|
import { BaseBenchmark } from './common/base-benchmark.js';
|
|
5
|
+
import { HighResTimer } from './helpers/timing.js';
|
|
5
6
|
export class ConsumerBenchmark extends BaseBenchmark {
|
|
6
7
|
async ensureQueue() {
|
|
7
8
|
return new Promise((resolve, reject) => {
|
|
@@ -26,20 +27,14 @@ export class ConsumerBenchmark extends BaseBenchmark {
|
|
|
26
27
|
run(cb) {
|
|
27
28
|
console.log('Starting consumer throughput benchmark...');
|
|
28
29
|
console.log(`Queue: ${this.queue.ns}/${this.queue.name} | Messages: ${this.totalMessages} | Consumers: ${this.workerCount}`);
|
|
29
|
-
const onComplete = (
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
console.log(`Overall throughput: ${(result.total / (totalTime / 1000)).toFixed(0)} messages/second`);
|
|
37
|
-
console.log('========================================\n');
|
|
38
|
-
cb(null, result);
|
|
39
|
-
})
|
|
40
|
-
.catch((err) => cb(err));
|
|
30
|
+
const onComplete = (r) => {
|
|
31
|
+
console.log('\n========== BENCHMARK COMPLETE ==========');
|
|
32
|
+
console.log(`Total messages consumed: ${r.totalMessages}`);
|
|
33
|
+
console.log(`Total time: ${HighResTimer.format(r.totalTimeNs)}`);
|
|
34
|
+
console.log(`Overall throughput: ${r.throughput} messages/second`);
|
|
35
|
+
console.log('========================================\n');
|
|
36
|
+
cb();
|
|
41
37
|
};
|
|
42
|
-
const messageHandler = this.createMessageHandler(onComplete);
|
|
43
38
|
async.series([
|
|
44
39
|
(cb) => this.ensureQueue()
|
|
45
40
|
.then(() => cb())
|
|
@@ -48,6 +43,7 @@ export class ConsumerBenchmark extends BaseBenchmark {
|
|
|
48
43
|
.then(() => cb())
|
|
49
44
|
.catch(cb),
|
|
50
45
|
(cb) => {
|
|
46
|
+
const messageHandler = this.createMessageHandler(onComplete);
|
|
51
47
|
this.createWorkers(messageHandler)
|
|
52
48
|
.then(() => cb())
|
|
53
49
|
.catch(cb);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"consumer-benchmark.js","sourceRoot":"","sources":["../../../src/consumer-benchmark.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAa,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE1D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"consumer-benchmark.js","sourceRoot":"","sources":["../../../src/consumer-benchmark.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAa,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE1D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,MAAM,OAAO,iBAAkB,SAAQ,aAAa;IACxC,KAAK,CAAC,WAAW;QACzB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE;gBAC9B,IAAI,GAAG;oBAAE,MAAM,CAAC,GAAG,CAAC,CAAC;;oBAChB,OAAO,EAAE,CAAC;YACjB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAES,KAAK,CAAC,YAAY;QAC1B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC,GAAG,EAAE,EAAE;gBACnD,IAAI,GAAG;oBAAE,MAAM,CAAC,GAAG,CAAC,CAAC;;oBAChB,OAAO,EAAE,CAAC;YACjB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,GAAG,CAAC,EAA+B;QACxC,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;QACzD,OAAO,CAAC,GAAG,CACT,UAAU,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,gBAAgB,IAAI,CAAC,aAAa,iBAAiB,IAAI,CAAC,WAAW,EAAE,CAChH,CAAC;QAEF,MAAM,UAAU,GAAG,CAAC,CAAmB,EAAE,EAAE;YACzC,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;YAC1D,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC;YAC3D,OAAO,CAAC,GAAG,CAAC,eAAe,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;YACjE,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC,UAAU,kBAAkB,CAAC,CAAC;YACnE,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;YAC1D,EAAE,EAAE,CAAC;QACP,CAAC,CAAC;QAEF,KAAK,CAAC,MAAM,CACV;YACE,CAAC,EAAE,EAAE,EAAE,CACL,IAAI,CAAC,WAAW,EAAE;iBACf,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;iBAChB,KAAK,CAAC,EAAE,CAAC;YACd,CAAC,EAAE,EAAE,EAAE,CACL,IAAI,CAAC,YAAY,EAAE;iBAChB,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;iBAChB,KAAK,CAAC,EAAE,CAAC;YACd,CAAC,EAAE,EAAE,EAAE;gBACL,MAAM,cAAc,GAAG,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC;gBAC7D,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC;qBAC/B,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;qBAChB,KAAK,CAAC,EAAE,CAAC,CAAC;YACf,CAAC;SACF,EACD,CAAC,GAAG,EAAE,EAAE;YACN,IAAI,GAAG;gBAAE,EAAE,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC,CACF,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"e2e-benchmark.d.ts","sourceRoot":"","sources":["../../../src/e2e-benchmark.ts"],"names":[],"mappings":"AAUA,OAAO,EAAS,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAEL,mBAAmB,EACnB,mBAAmB,
|
|
1
|
+
{"version":3,"file":"e2e-benchmark.d.ts","sourceRoot":"","sources":["../../../src/e2e-benchmark.ts"],"names":[],"mappings":"AAUA,OAAO,EAAS,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAEL,mBAAmB,EACnB,mBAAmB,EAGpB,MAAM,kBAAkB,CAAC;AAkB1B,wBAAgB,eAAe,CAC7B,MAAM,EAAE,mBAAmB,EAC3B,EAAE,EAAE,SAAS,CAAC,mBAAmB,CAAC,QA8MnC"}
|
|
@@ -2,94 +2,79 @@ import { ensureQueue } from './helpers/ensure-queue.js';
|
|
|
2
2
|
import { async } from 'redis-smq-common';
|
|
3
3
|
import { EWorkerMessageType, } from './types/index.js';
|
|
4
4
|
import { createWorker } from './helpers/create-worker.js';
|
|
5
|
+
import { HighResTimer } from './helpers/timing.js';
|
|
6
|
+
import { calculateBenchmarkResult } from './helpers/calculate-benchmark-result.js';
|
|
5
7
|
export function runE2EBenchmark(config, cb) {
|
|
6
8
|
const { redisConfig, queue, totalMessages, producerWorkerPath, consumerWorkerPath, producerCount, consumerCount, showProgress, } = config;
|
|
7
9
|
console.log('Starting end-to-end throughput benchmark...');
|
|
8
10
|
console.log(`Queue: ${queue.ns}/${queue.name} | Messages: ${totalMessages} | Producers: ${producerCount} | Consumers: ${consumerCount}`);
|
|
9
11
|
const allWorkers = [];
|
|
12
|
+
const consumerWorkerResults = [];
|
|
13
|
+
const producerWorkerResults = [];
|
|
10
14
|
let completedProducers = 0;
|
|
11
15
|
let completedConsumers = 0;
|
|
12
|
-
let totalProduced = 0;
|
|
13
|
-
let totalConsumed = 0;
|
|
14
|
-
let totalProductionTime = 0;
|
|
15
|
-
let totalConsumptionTime = 0;
|
|
16
|
-
let productionStartTime = 0;
|
|
17
|
-
let consumptionStartTime = 0;
|
|
18
|
-
let productionEndTime = 0;
|
|
19
|
-
let consumptionEndTime = 0;
|
|
20
|
-
let benchmarkStartTime = 0;
|
|
21
|
-
let benchmarkEndTime = 0;
|
|
22
16
|
const onProducerMessage = (msg) => {
|
|
23
17
|
if (msg.type === EWorkerMessageType.COMPLETED) {
|
|
24
18
|
completedProducers++;
|
|
19
|
+
producerWorkerResults.push(msg.data);
|
|
25
20
|
const { workerId, processed, timeTaken } = msg.data;
|
|
26
|
-
|
|
27
|
-
totalProductionTime += Number(timeTaken);
|
|
28
|
-
productionEndTime = Date.now();
|
|
29
|
-
console.log(`Producer ${workerId} completed: ${processed} messages in ${(Number(timeTaken) / 1000).toFixed(2)}s (${(Number(processed) / (Number(timeTaken) / 1000)).toFixed(0)} msg/s)`);
|
|
21
|
+
console.log(`Producer ${workerId} completed: ${processed} messages in ${HighResTimer.format(timeTaken)} (${(processed / HighResTimer.toSeconds(timeTaken)).toFixed(0)} msg/s)`);
|
|
30
22
|
checkBenchmarkCompletion();
|
|
31
23
|
}
|
|
32
24
|
else if (msg.type === EWorkerMessageType.PROGRESS && showProgress) {
|
|
33
|
-
const { workerId,
|
|
34
|
-
console.log(`Producer ${workerId} progress: ${
|
|
25
|
+
const { workerId, progress } = msg.data;
|
|
26
|
+
console.log(`Producer ${workerId} progress: ${progress} messages`);
|
|
35
27
|
}
|
|
36
28
|
};
|
|
37
29
|
const onConsumerMessage = (msg) => {
|
|
38
30
|
if (msg.type === EWorkerMessageType.COMPLETED) {
|
|
39
31
|
completedConsumers++;
|
|
32
|
+
consumerWorkerResults.push(msg.data);
|
|
40
33
|
const { workerId, processed, timeTaken } = msg.data;
|
|
41
|
-
|
|
42
|
-
totalConsumptionTime += Number(timeTaken);
|
|
43
|
-
consumptionEndTime = Date.now();
|
|
44
|
-
console.log(`Consumer ${workerId} completed: ${processed} messages in ${(Number(timeTaken) / 1000).toFixed(2)}s (${(Number(processed) / (Number(timeTaken) / 1000)).toFixed(0)} msg/s)`);
|
|
34
|
+
console.log(`Consumer ${workerId} completed: ${processed} messages in ${HighResTimer.format(timeTaken)} (${(processed / HighResTimer.toSeconds(timeTaken)).toFixed(0)} msg/s)`);
|
|
45
35
|
checkBenchmarkCompletion();
|
|
46
36
|
}
|
|
47
37
|
else if (msg.type === EWorkerMessageType.PROGRESS && showProgress) {
|
|
48
|
-
const { workerId,
|
|
49
|
-
console.log(`Consumer ${workerId} progress: ${
|
|
38
|
+
const { workerId, progress } = msg.data;
|
|
39
|
+
console.log(`Consumer ${workerId} progress: ${progress} messages`);
|
|
50
40
|
}
|
|
51
41
|
};
|
|
52
42
|
const checkBenchmarkCompletion = () => {
|
|
53
43
|
if (completedProducers === producerCount &&
|
|
54
44
|
completedConsumers === consumerCount) {
|
|
55
|
-
benchmarkEndTime = Date.now();
|
|
56
|
-
const totalTime = benchmarkEndTime - benchmarkStartTime;
|
|
57
|
-
const productionTime = productionEndTime - productionStartTime;
|
|
58
|
-
const consumptionTime = consumptionEndTime - consumptionStartTime;
|
|
59
|
-
const productionThroughput = totalProduced / (productionTime / 1000);
|
|
60
|
-
const consumptionThroughput = totalConsumed / (consumptionTime / 1000);
|
|
61
45
|
console.log('\n========== E2E BENCHMARK COMPLETE ==========');
|
|
46
|
+
const pResult = calculateBenchmarkResult(producerWorkerResults);
|
|
47
|
+
const cResult = calculateBenchmarkResult(consumerWorkerResults);
|
|
48
|
+
const result = {
|
|
49
|
+
totalTime: Math.max(pResult.totalTimeNs, cResult.totalTimeNs),
|
|
50
|
+
totalMessages: pResult.totalMessages + cResult.totalMessages,
|
|
51
|
+
workerCount: producerCount + consumerCount,
|
|
52
|
+
productionTime: pResult.totalTimeNs,
|
|
53
|
+
consumptionTime: cResult.totalTimeNs,
|
|
54
|
+
messagesProduced: pResult.totalMessages,
|
|
55
|
+
messagesConsumed: cResult.totalMessages,
|
|
56
|
+
productionThroughput: pResult.throughput,
|
|
57
|
+
consumptionThroughput: cResult.throughput,
|
|
58
|
+
};
|
|
62
59
|
console.log(`Production Phase:`);
|
|
63
|
-
console.log(` Total produced: ${
|
|
64
|
-
console.log(` Production time: ${(productionTime
|
|
65
|
-
console.log(` Production throughput: ${productionThroughput
|
|
60
|
+
console.log(` Total produced: ${result.messagesProduced}`);
|
|
61
|
+
console.log(` Production time: ${HighResTimer.format(result.productionTime)}`);
|
|
62
|
+
console.log(` Production throughput: ${result.productionThroughput} msg/s`);
|
|
66
63
|
console.log(`\nConsumption Phase:`);
|
|
67
|
-
console.log(` Total consumed: ${
|
|
68
|
-
console.log(` Consumption time: ${(consumptionTime
|
|
69
|
-
console.log(` Consumption throughput: ${consumptionThroughput
|
|
64
|
+
console.log(` Total consumed: ${result.messagesConsumed}`);
|
|
65
|
+
console.log(` Consumption time: ${HighResTimer.format(result.consumptionTime)}`);
|
|
66
|
+
console.log(` Consumption throughput: ${result.consumptionThroughput} msg/s`);
|
|
70
67
|
console.log(`\nEnd-to-End:`);
|
|
71
|
-
console.log(` Total time: ${(totalTime
|
|
72
|
-
console.log(` Overall throughput: ${(
|
|
73
|
-
console.log(` System backlog: ${
|
|
74
|
-
if (
|
|
68
|
+
console.log(` Total time: ${HighResTimer.format(result.totalTime)}`);
|
|
69
|
+
console.log(` Overall throughput: ${(result.messagesProduced / HighResTimer.toSeconds(result.totalTime)).toFixed(0)} msg/s`);
|
|
70
|
+
console.log(` System backlog: ${result.messagesProduced - result.messagesConsumed} messages`);
|
|
71
|
+
if (result.messagesProduced === result.messagesConsumed) {
|
|
75
72
|
console.log(` Status: All messages processed successfully ✓`);
|
|
76
73
|
}
|
|
77
74
|
else {
|
|
78
|
-
console.log(` Status: ${
|
|
75
|
+
console.log(` Status: ${result.messagesProduced - result.messagesConsumed} messages not consumed ⚠️`);
|
|
79
76
|
}
|
|
80
77
|
console.log('============================================\n');
|
|
81
|
-
const result = {
|
|
82
|
-
totalTime,
|
|
83
|
-
totalWorkerTime: totalProductionTime + totalConsumptionTime,
|
|
84
|
-
total: totalProduced + totalConsumed,
|
|
85
|
-
workerCount: producerCount + consumerCount,
|
|
86
|
-
productionTime,
|
|
87
|
-
consumptionTime,
|
|
88
|
-
messagesProduced: totalProduced,
|
|
89
|
-
messagesConsumed: totalConsumed,
|
|
90
|
-
productionThroughput,
|
|
91
|
-
consumptionThroughput,
|
|
92
|
-
};
|
|
93
78
|
const shutdownPromises = Promise.all(allWorkers.map((worker) => {
|
|
94
79
|
worker.removeAllListeners();
|
|
95
80
|
return worker.terminate();
|
|
@@ -107,9 +92,6 @@ export function runE2EBenchmark(config, cb) {
|
|
|
107
92
|
const remainingConsumers = totalMessages % consumerCount;
|
|
108
93
|
console.log(`Messages per producer (approx): ${messagesPerProducer}`);
|
|
109
94
|
console.log(`Messages per consumer (approx): ${messagesPerConsumer}`);
|
|
110
|
-
benchmarkStartTime = Date.now();
|
|
111
|
-
productionStartTime = Date.now();
|
|
112
|
-
consumptionStartTime = Date.now();
|
|
113
95
|
try {
|
|
114
96
|
for (let i = 0; i < producerCount; i++) {
|
|
115
97
|
let producerMessageCount = messagesPerProducer;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"e2e-benchmark.js","sourceRoot":"","sources":["../../../src/e2e-benchmark.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,KAAK,EAAa,MAAM,kBAAkB,CAAC;AACpD,OAAO,EACL,kBAAkB,
|
|
1
|
+
{"version":3,"file":"e2e-benchmark.js","sourceRoot":"","sources":["../../../src/e2e-benchmark.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"calculate-benchmark-result.d.ts","sourceRoot":"","sources":["../../../../src/helpers/calculate-benchmark-result.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAG7E,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,sBAAsB,CAAC,MAAM,CAAC,EAAE,GAC3C,gBAAgB,CAalB"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { HighResTimer } from './timing.js';
|
|
2
|
+
export function calculateBenchmarkResult(resultData) {
|
|
3
|
+
const totalMessages = resultData.reduce((sum, c) => sum + c.processed, 0);
|
|
4
|
+
const maxTimeNs = Math.max(...resultData.map((c) => c.timeTaken));
|
|
5
|
+
let throughput = 0;
|
|
6
|
+
if (maxTimeNs) {
|
|
7
|
+
const maxTimeSeconds = HighResTimer.toSeconds(maxTimeNs);
|
|
8
|
+
throughput = Number((totalMessages / maxTimeSeconds).toFixed(0));
|
|
9
|
+
}
|
|
10
|
+
return {
|
|
11
|
+
totalMessages,
|
|
12
|
+
totalTimeNs: maxTimeNs,
|
|
13
|
+
throughput,
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=calculate-benchmark-result.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"calculate-benchmark-result.js","sourceRoot":"","sources":["../../../../src/helpers/calculate-benchmark-result.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,UAAU,wBAAwB,CACtC,UAA4C;IAE5C,MAAM,aAAa,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IAC1E,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IAClE,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,cAAc,GAAG,YAAY,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACzD,UAAU,GAAG,MAAM,CAAC,CAAC,aAAa,GAAG,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACnE,CAAC;IACD,OAAO;QACL,aAAa;QACb,WAAW,EAAE,SAAS;QACtB,UAAU;KACX,CAAC;AACJ,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Worker } from 'worker_threads';
|
|
2
|
-
import {
|
|
2
|
+
import { TWorkerMessage } from '../types/index.js';
|
|
3
3
|
import { IQueueParams } from 'redis-smq';
|
|
4
4
|
import { IRedisConfig } from 'redis-smq-common';
|
|
5
5
|
export declare function createWorker(params: {
|
|
@@ -8,6 +8,6 @@ export declare function createWorker(params: {
|
|
|
8
8
|
queue: IQueueParams;
|
|
9
9
|
expectedMessages: number;
|
|
10
10
|
redisConfig: IRedisConfig;
|
|
11
|
-
onMessage: (message:
|
|
11
|
+
onMessage: (message: TWorkerMessage) => void;
|
|
12
12
|
}): Worker;
|
|
13
13
|
//# sourceMappingURL=create-worker.d.ts.map
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare class HighResTimer {
|
|
2
|
+
static now(): number;
|
|
3
|
+
static since(start: number): number;
|
|
4
|
+
static toMicroseconds(ns: number): number;
|
|
5
|
+
static toMilliseconds(ns: number): number;
|
|
6
|
+
static toSeconds(ns: number): number;
|
|
7
|
+
static format(ns: number): string;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=timing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timing.d.ts","sourceRoot":"","sources":["../../../../src/helpers/timing.ts"],"names":[],"mappings":"AASA,qBAAa,YAAY;IACvB,MAAM,CAAC,GAAG,IAAI,MAAM;IAMpB,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAKnC,MAAM,CAAC,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM;IAIzC,MAAM,CAAC,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM;IAIzC,MAAM,CAAC,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM;IAIpC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM;CAMlC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export class HighResTimer {
|
|
2
|
+
static now() {
|
|
3
|
+
const [seconds, nanoseconds] = process.hrtime();
|
|
4
|
+
return seconds * 1e9 + nanoseconds;
|
|
5
|
+
}
|
|
6
|
+
static since(start) {
|
|
7
|
+
const now = this.now();
|
|
8
|
+
return now - start;
|
|
9
|
+
}
|
|
10
|
+
static toMicroseconds(ns) {
|
|
11
|
+
return ns / 1000;
|
|
12
|
+
}
|
|
13
|
+
static toMilliseconds(ns) {
|
|
14
|
+
return ns / 1e6;
|
|
15
|
+
}
|
|
16
|
+
static toSeconds(ns) {
|
|
17
|
+
return ns / 1e9;
|
|
18
|
+
}
|
|
19
|
+
static format(ns) {
|
|
20
|
+
if (ns < 1000)
|
|
21
|
+
return `${ns.toFixed(0)}ns`;
|
|
22
|
+
if (ns < 1e6)
|
|
23
|
+
return `${(ns / 1000).toFixed(2)}µs`;
|
|
24
|
+
if (ns < 1e9)
|
|
25
|
+
return `${(ns / 1e6).toFixed(2)}ms`;
|
|
26
|
+
return `${(ns / 1e9).toFixed(2)}s`;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=timing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timing.js","sourceRoot":"","sources":["../../../../src/helpers/timing.ts"],"names":[],"mappings":"AASA,MAAM,OAAO,YAAY;IACvB,MAAM,CAAC,GAAG;QAER,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;QAChD,OAAO,OAAO,GAAG,GAAG,GAAG,WAAW,CAAC;IACrC,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,KAAa;QACxB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,OAAO,GAAG,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,MAAM,CAAC,cAAc,CAAC,EAAU;QAC9B,OAAO,EAAE,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,MAAM,CAAC,cAAc,CAAC,EAAU;QAC9B,OAAO,EAAE,GAAG,GAAG,CAAC;IAClB,CAAC;IAED,MAAM,CAAC,SAAS,CAAC,EAAU;QACzB,OAAO,EAAE,GAAG,GAAG,CAAC;IAClB,CAAC;IAED,MAAM,CAAC,MAAM,CAAC,EAAU;QACtB,IAAI,EAAE,GAAG,IAAI;YAAE,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;QAC3C,IAAI,EAAE,GAAG,GAAG;YAAE,OAAO,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;QACnD,IAAI,EAAE,GAAG,GAAG;YAAE,OAAO,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;QAClD,OAAO,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IACrC,CAAC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"producer-benchmark.d.ts","sourceRoot":"","sources":["../../../src/producer-benchmark.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"producer-benchmark.d.ts","sourceRoot":"","sources":["../../../src/producer-benchmark.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAG3D,qBAAa,iBAAkB,SAAQ,aAAa;cAClC,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IASrC,GAAG,CAAC,EAAE,EAAE,SAAS,CAAC,gBAAgB,CAAC,GAAG,IAAI;CAiClD"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { async } from 'redis-smq-common';
|
|
2
2
|
import { ensureQueue } from './helpers/ensure-queue.js';
|
|
3
3
|
import { BaseBenchmark } from './common/base-benchmark.js';
|
|
4
|
+
import { HighResTimer } from './helpers/timing.js';
|
|
4
5
|
export class ProducerBenchmark extends BaseBenchmark {
|
|
5
6
|
async ensureQueue() {
|
|
6
7
|
return new Promise((resolve, reject) => {
|
|
@@ -15,25 +16,20 @@ export class ProducerBenchmark extends BaseBenchmark {
|
|
|
15
16
|
run(cb) {
|
|
16
17
|
console.log('Starting producer throughput benchmark...');
|
|
17
18
|
console.log(`Queue: ${this.queue.ns}/${this.queue.name} | Messages: ${this.totalMessages} | Producers: ${this.workerCount}`);
|
|
18
|
-
const onComplete = (
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
console.log(`Overall throughput: ${(result.total / (totalTime / 1000)).toFixed(0)} messages/second`);
|
|
26
|
-
console.log('========================================\n');
|
|
27
|
-
cb(null, result);
|
|
28
|
-
})
|
|
29
|
-
.catch((err) => cb(err));
|
|
19
|
+
const onComplete = (r) => {
|
|
20
|
+
console.log('\n========== BENCHMARK COMPLETE ==========');
|
|
21
|
+
console.log(`Total messages produced: ${r.totalMessages}`);
|
|
22
|
+
console.log(`Total time: ${HighResTimer.format(r.totalTimeNs)}`);
|
|
23
|
+
console.log(`Overall throughput: ${r.throughput} messages/second`);
|
|
24
|
+
console.log('========================================\n');
|
|
25
|
+
cb();
|
|
30
26
|
};
|
|
31
|
-
const messageHandler = this.createMessageHandler(onComplete);
|
|
32
27
|
async.series([
|
|
33
28
|
(cb) => this.ensureQueue()
|
|
34
29
|
.then(() => cb())
|
|
35
30
|
.catch(cb),
|
|
36
31
|
(cb) => {
|
|
32
|
+
const messageHandler = this.createMessageHandler(onComplete);
|
|
37
33
|
this.createWorkers(messageHandler)
|
|
38
34
|
.then(() => cb())
|
|
39
35
|
.catch(cb);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"producer-benchmark.js","sourceRoot":"","sources":["../../../src/producer-benchmark.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAa,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"producer-benchmark.js","sourceRoot":"","sources":["../../../src/producer-benchmark.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAa,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,MAAM,OAAO,iBAAkB,SAAQ,aAAa;IACxC,KAAK,CAAC,WAAW;QACzB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE;gBAC9B,IAAI,GAAG;oBAAE,MAAM,CAAC,GAAG,CAAC,CAAC;;oBAChB,OAAO,EAAE,CAAC;YACjB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,GAAG,CAAC,EAA+B;QACxC,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;QACzD,OAAO,CAAC,GAAG,CACT,UAAU,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,gBAAgB,IAAI,CAAC,aAAa,iBAAiB,IAAI,CAAC,WAAW,EAAE,CAChH,CAAC;QAEF,MAAM,UAAU,GAAG,CAAC,CAAmB,EAAE,EAAE;YACzC,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;YAC1D,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC;YAC3D,OAAO,CAAC,GAAG,CAAC,eAAe,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;YACjE,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC,UAAU,kBAAkB,CAAC,CAAC;YACnE,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;YAC1D,EAAE,EAAE,CAAC;QACP,CAAC,CAAC;QAEF,KAAK,CAAC,MAAM,CACV;YACE,CAAC,EAAE,EAAE,EAAE,CACL,IAAI,CAAC,WAAW,EAAE;iBACf,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;iBAChB,KAAK,CAAC,EAAE,CAAC;YACd,CAAC,EAAE,EAAE,EAAE;gBACL,MAAM,cAAc,GAAG,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC;gBAC7D,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC;qBAC/B,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;qBAChB,KAAK,CAAC,EAAE,CAAC,CAAC;YACf,CAAC;SACF,EACD,CAAC,GAAG,EAAE,EAAE;YACN,IAAI,GAAG;gBAAE,EAAE,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC,CACF,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { parentPort, workerData } from 'worker_threads';
|
|
2
2
|
import { RedisSMQ } from 'redis-smq';
|
|
3
3
|
import { async } from 'redis-smq-common';
|
|
4
|
-
import { EWorkerMessageType } from '../types/index.js';
|
|
4
|
+
import { EWorkerMessageType, } from '../types/index.js';
|
|
5
|
+
import { HighResTimer } from '../helpers/timing.js';
|
|
5
6
|
const { queue, redisConfig, workerId, expectedMessages } = workerData;
|
|
6
7
|
let consumedCount = 0;
|
|
7
8
|
let startTime = 0;
|
|
@@ -12,26 +13,27 @@ RedisSMQ.initialize(redisConfig, (err) => {
|
|
|
12
13
|
async.series([
|
|
13
14
|
(cb) => consumer.run(cb),
|
|
14
15
|
(cb) => {
|
|
15
|
-
startTime =
|
|
16
|
+
startTime = HighResTimer.now();
|
|
16
17
|
consumer.consume(queue, (_msg, ack) => {
|
|
17
18
|
consumedCount++;
|
|
18
19
|
ack();
|
|
19
20
|
if (expectedMessages > 0 &&
|
|
20
21
|
consumedCount % Math.max(1, Math.floor(expectedMessages / 10)) ===
|
|
21
22
|
0) {
|
|
22
|
-
|
|
23
|
+
const message = {
|
|
23
24
|
type: EWorkerMessageType.PROGRESS,
|
|
24
|
-
data: { workerId,
|
|
25
|
-
}
|
|
25
|
+
data: { workerId, progress: consumedCount },
|
|
26
|
+
};
|
|
27
|
+
parentPort?.postMessage(message);
|
|
26
28
|
}
|
|
27
29
|
if (expectedMessages > 0 && consumedCount >= expectedMessages) {
|
|
28
|
-
const timeTaken =
|
|
30
|
+
const timeTaken = HighResTimer.now() - startTime;
|
|
29
31
|
consumer.cancel(queue, (err) => {
|
|
30
32
|
if (err) {
|
|
31
33
|
console.error(`Worker ${workerId} error cancelling consumer:`, err);
|
|
32
34
|
return cb(err);
|
|
33
35
|
}
|
|
34
|
-
|
|
36
|
+
const message = {
|
|
35
37
|
type: EWorkerMessageType.COMPLETED,
|
|
36
38
|
data: {
|
|
37
39
|
workerId,
|
|
@@ -39,7 +41,8 @@ RedisSMQ.initialize(redisConfig, (err) => {
|
|
|
39
41
|
timeTaken,
|
|
40
42
|
expected: expectedMessages,
|
|
41
43
|
},
|
|
42
|
-
}
|
|
44
|
+
};
|
|
45
|
+
parentPort?.postMessage(message);
|
|
43
46
|
cb();
|
|
44
47
|
});
|
|
45
48
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"consumer-worker-thread.js","sourceRoot":"","sources":["../../../../src/threads/consumer-worker-thread.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,
|
|
1
|
+
{"version":3,"file":"consumer-worker-thread.js","sourceRoot":"","sources":["../../../../src/threads/consumer-worker-thread.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { parentPort, workerData } from 'worker_threads';
|
|
2
2
|
import { ProducibleMessage, RedisSMQ } from 'redis-smq';
|
|
3
3
|
import { async } from 'redis-smq-common';
|
|
4
|
-
import { EWorkerMessageType } from '../types/index.js';
|
|
4
|
+
import { EWorkerMessageType, } from '../types/index.js';
|
|
5
|
+
import { HighResTimer } from '../helpers/timing.js';
|
|
5
6
|
const { queue, redisConfig, workerId, expectedMessages } = workerData;
|
|
6
7
|
let producedCount = 0;
|
|
7
8
|
let startTime = 0;
|
|
@@ -12,7 +13,7 @@ RedisSMQ.initialize(redisConfig, (err) => {
|
|
|
12
13
|
async.series([
|
|
13
14
|
(cb) => producer.run(cb),
|
|
14
15
|
(cb) => {
|
|
15
|
-
startTime =
|
|
16
|
+
startTime = HighResTimer.now();
|
|
16
17
|
const pump = () => {
|
|
17
18
|
if (producedCount < expectedMessages) {
|
|
18
19
|
producedCount++;
|
|
@@ -26,8 +27,8 @@ RedisSMQ.initialize(redisConfig, (err) => {
|
|
|
26
27
|
});
|
|
27
28
|
}
|
|
28
29
|
else if (producedCount >= expectedMessages) {
|
|
29
|
-
const timeTaken =
|
|
30
|
-
|
|
30
|
+
const timeTaken = HighResTimer.now() - startTime;
|
|
31
|
+
const message = {
|
|
31
32
|
type: EWorkerMessageType.COMPLETED,
|
|
32
33
|
data: {
|
|
33
34
|
workerId,
|
|
@@ -35,7 +36,8 @@ RedisSMQ.initialize(redisConfig, (err) => {
|
|
|
35
36
|
timeTaken,
|
|
36
37
|
expected: expectedMessages,
|
|
37
38
|
},
|
|
38
|
-
}
|
|
39
|
+
};
|
|
40
|
+
parentPort?.postMessage(message);
|
|
39
41
|
return cb();
|
|
40
42
|
}
|
|
41
43
|
else
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"producer-worker-thread.js","sourceRoot":"","sources":["../../../../src/threads/producer-worker-thread.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACxD,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,
|
|
1
|
+
{"version":3,"file":"producer-worker-thread.js","sourceRoot":"","sources":["../../../../src/threads/producer-worker-thread.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACxD,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EACL,kBAAkB,GAGnB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,gBAAgB,EAAE,GACtD,UAAyB,CAAC;AAE5B,IAAI,aAAa,GAAG,CAAC,CAAC;AACtB,IAAI,SAAS,GAAG,CAAC,CAAC;AAElB,QAAQ,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,GAAG,EAAE,EAAE;IACvC,IAAI,GAAG;QAAE,MAAM,GAAG,CAAC;IACnB,MAAM,QAAQ,GAAG,QAAQ,CAAC,cAAc,EAAE,CAAC;IAE3C,KAAK,CAAC,MAAM,CACV;QACE,CAAC,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,CAAC,EAAE,EAAE,EAAE;YACL,SAAS,GAAG,YAAY,CAAC,GAAG,EAAE,CAAC;YAC/B,MAAM,IAAI,GAAG,GAAG,EAAE;gBAChB,IAAI,aAAa,GAAG,gBAAgB,EAAE,CAAC;oBACrC,aAAa,EAAE,CAAC;oBAChB,MAAM,GAAG,GAAG,IAAI,iBAAiB,EAAE;yBAChC,QAAQ,CAAC,KAAK,CAAC;yBACf,OAAO,CAAC,IAAI,aAAa,EAAE,CAAC,CAAC;oBAChC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE;wBAC7B,IAAI,IAAI;4BAAE,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC;wBAC1B,IAAI,EAAE,CAAC;oBACT,CAAC,CAAC,CAAC;gBACL,CAAC;qBAGI,IAAI,aAAa,IAAI,gBAAgB,EAAE,CAAC;oBAC3C,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;oBACjD,MAAM,OAAO,GAAmB;wBAC9B,IAAI,EAAE,kBAAkB,CAAC,SAAS;wBAClC,IAAI,EAAE;4BACJ,QAAQ;4BACR,SAAS,EAAE,aAAa;4BACxB,SAAS;4BACT,QAAQ,EAAE,gBAAgB;yBAC3B;qBACF,CAAC;oBACF,UAAU,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;oBACjC,OAAO,EAAE,EAAE,CAAC;gBACd,CAAC;;oBAGI,EAAE,EAAE,CAAC;YACZ,CAAC,CAAC;YACF,IAAI,EAAE,CAAC;QACT,CAAC;KACF,EACD,CAAC,GAAG,EAAE,EAAE;QACN,IAAI,GAAG,EAAE,CAAC;YACR,OAAO,CAAC,KAAK,CAAC,UAAU,QAAQ,SAAS,EAAE,GAAG,CAAC,CAAC;YAChD,MAAM,GAAG,CAAC;QACZ,CAAC;QACD,QAAQ,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAClC,CAAC,CACF,CAAC;AACJ,CAAC,CAAC,CAAC"}
|
|
@@ -4,21 +4,29 @@ export declare enum EWorkerMessageType {
|
|
|
4
4
|
PROGRESS = "PROGRESS",
|
|
5
5
|
COMPLETED = "COMPLETED"
|
|
6
6
|
}
|
|
7
|
-
export interface IWorkerMessageData {
|
|
8
|
-
workerId: number;
|
|
9
|
-
processed: number;
|
|
10
|
-
timeTaken: number;
|
|
11
|
-
expected: number;
|
|
12
|
-
}
|
|
13
7
|
export interface IWorkerData {
|
|
14
8
|
queue: IQueueParams;
|
|
15
9
|
redisConfig: IRedisConfig;
|
|
16
10
|
workerId: number;
|
|
17
11
|
expectedMessages: number;
|
|
18
12
|
}
|
|
19
|
-
export
|
|
20
|
-
|
|
21
|
-
|
|
13
|
+
export type TWorkerMessage = IWorkerProgressMessage | IWorkerCompleteMessage;
|
|
14
|
+
export type TWorkerMessageHandler = (msg: TWorkerMessage) => void;
|
|
15
|
+
export interface IWorkerCompleteMessage {
|
|
16
|
+
type: EWorkerMessageType.COMPLETED;
|
|
17
|
+
data: {
|
|
18
|
+
workerId: number;
|
|
19
|
+
processed: number;
|
|
20
|
+
timeTaken: number;
|
|
21
|
+
expected: number;
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
export interface IWorkerProgressMessage {
|
|
25
|
+
type: EWorkerMessageType.PROGRESS;
|
|
26
|
+
data: {
|
|
27
|
+
workerId: number;
|
|
28
|
+
progress: number;
|
|
29
|
+
};
|
|
22
30
|
}
|
|
23
31
|
export interface IBenchmarkConfig {
|
|
24
32
|
redisConfig: IRedisConfig;
|
|
@@ -40,12 +48,14 @@ export interface IE2EBenchmarkConfig {
|
|
|
40
48
|
showProgress: boolean;
|
|
41
49
|
}
|
|
42
50
|
export interface IBenchmarkResult {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
workerCount: number;
|
|
51
|
+
totalMessages: number;
|
|
52
|
+
totalTimeNs: number;
|
|
53
|
+
throughput: number;
|
|
47
54
|
}
|
|
48
|
-
export interface IE2EBenchmarkResult
|
|
55
|
+
export interface IE2EBenchmarkResult {
|
|
56
|
+
workerCount: number;
|
|
57
|
+
totalMessages: number;
|
|
58
|
+
totalTime: number;
|
|
49
59
|
productionTime: number;
|
|
50
60
|
consumptionTime: number;
|
|
51
61
|
messagesProduced: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/types/index.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,oBAAY,kBAAkB;IAC5B,QAAQ,aAAa;IACrB,SAAS,cAAc;CACxB;AAED,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/types/index.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,oBAAY,kBAAkB;IAC5B,QAAQ,aAAa;IACrB,SAAS,cAAc;CACxB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,YAAY,CAAC;IACpB,WAAW,EAAE,YAAY,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,MAAM,cAAc,GAAG,sBAAsB,GAAG,sBAAsB,CAAC;AAE7E,MAAM,MAAM,qBAAqB,GAAG,CAAC,GAAG,EAAE,cAAc,KAAK,IAAI,CAAC;AAElE,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,kBAAkB,CAAC,SAAS,CAAC;IACnC,IAAI,EAAE;QACJ,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,kBAAkB,CAAC,QAAQ,CAAC;IAClC,IAAI,EAAE;QACJ,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAED,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,YAAY,CAAC;IAC1B,KAAK,EAAE,YAAY,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,YAAY,CAAC;IAC1B,KAAK,EAAE,YAAY,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,qBAAqB,EAAE,MAAM,CAAC;CAC/B"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "redis-smq-benchmarks",
|
|
3
|
-
"version": "9.0.9-next.
|
|
3
|
+
"version": "9.0.9-next.3",
|
|
4
4
|
"description": "Benchmarking tool for RedisSMQ to assess performance and throughput in your application environment.",
|
|
5
5
|
"author": "Weyoss <weyoss@outlook.com>",
|
|
6
6
|
"license": "MIT",
|
|
@@ -50,8 +50,8 @@
|
|
|
50
50
|
}
|
|
51
51
|
},
|
|
52
52
|
"peerDependencies": {
|
|
53
|
-
"redis-smq
|
|
54
|
-
"redis-smq": "^9.0.9-next.
|
|
53
|
+
"redis-smq": "^9.0.9-next.3",
|
|
54
|
+
"redis-smq-common": "^9.0.9-next.3"
|
|
55
55
|
},
|
|
56
56
|
"dependencies": {
|
|
57
57
|
"ioredis": "^5"
|