fixed up worker counts

This commit is contained in:
Boki 2025-06-24 15:09:50 -04:00
parent f41622e530
commit fa67d666dc
5 changed files with 182 additions and 28 deletions

View file

@ -152,6 +152,7 @@ export class QueueManager {
concurrency,
startWorker: workers > 0 && !this.config.delayWorkerStart,
handlerRegistry: options.handlerRegistry || this.handlerRegistry,
serviceName: this.config.serviceName,
};
const queue = new Queue(

View file

@ -19,6 +19,7 @@ export interface QueueWorkerConfig {
concurrency?: number;
startWorker?: boolean;
handlerRegistry?: HandlerRegistry;
serviceName?: string;
}
/**
@ -33,6 +34,7 @@ export class Queue {
private redisConfig: RedisConfig;
private readonly logger: Logger;
private readonly handlerRegistry?: HandlerRegistry;
private serviceName?: string;
constructor(
queueName: string,
@ -45,9 +47,11 @@ export class Queue {
this.redisConfig = redisConfig;
this.logger = logger || console;
this.handlerRegistry = config.handlerRegistry;
this.serviceName = config.serviceName;
this.logger.debug('Queue constructor called', {
queueName,
serviceName: this.serviceName,
hasHandlerRegistry: !!config.handlerRegistry,
handlerRegistryType: config.handlerRegistry ? typeof config.handlerRegistry : 'undefined',
configKeys: Object.keys(config),
@ -176,6 +180,9 @@ export class Queue {
]);
const isPaused = await this.bullQueue.isPaused();
// Get actual active worker count from BullMQ
const activeWorkerCount = await this.getActiveWorkerCount();
return {
waiting: waiting.length,
@ -184,7 +191,7 @@ export class Queue {
failed: failed.length,
delayed: delayed.length,
paused: isPaused,
workers: this.workers.length,
workers: activeWorkerCount, // Use BullMQ's tracked count instead of local array
};
}
@ -307,11 +314,13 @@ export class Queue {
concurrency,
maxStalledCount: 3,
stalledInterval: 30000,
// Add a name to identify the worker
name: `${this.serviceName || 'unknown'}_worker_${i}`,
});
this.logger.info(`Starting worker ${i + 1}/${workerCount} for queue`, {
queueName: this.queueName,
workerId: i,
workerName: worker.name,
concurrency,
});
@ -438,4 +447,69 @@ export class Queue {
getWorkerCount(): number {
return this.workers.length;
}
/**
* Get active workers from BullMQ
* This uses BullMQ's built-in worker tracking
*/
async getActiveWorkers(): Promise<any[]> {
try {
const workers = await this.bullQueue.getWorkers();
return workers;
} catch (error) {
this.logger.error('Failed to get active workers', {
queueName: this.queueName,
error
});
return [];
}
}
/**
* Get count of active workers from BullMQ
*/
async getActiveWorkerCount(): Promise<number> {
try {
const workers = await this.bullQueue.getWorkers();
return workers.length;
} catch (error) {
this.logger.error('Failed to get active worker count', {
queueName: this.queueName,
error
});
return 0;
}
}
/**
* Get detailed worker information
*/
async getWorkerDetails(): Promise<Array<{
id: string;
name?: string;
addr?: string;
age?: number;
idle?: number;
started?: number;
}>> {
try {
const workers = await this.bullQueue.getWorkers();
return workers.map(worker => ({
id: worker.id || 'unknown',
name: worker.name,
addr: worker.addr,
age: typeof worker.age === 'string' ? parseInt(worker.age) : worker.age,
idle: typeof worker.idle === 'string' ? parseInt(worker.idle) : worker.idle,
started: typeof worker.started === 'string' ? parseInt(worker.started) : worker.started,
}));
} catch (error) {
this.logger.error('Failed to get worker details', {
queueName: this.queueName,
error
});
return [];
}
}
}