У нас есть проект, построенный на микросервисах. Для сообщений между микросервисами мы используем SenecaJS, а для асинхронных задач - BullJS. И теперь у нас есть проблема. У нас есть следующее поведение:1. Пользователь отправляет запрос на сервер2. Управлять сервером с помощью этого запроса и вызывать асинхронные задачи в очереди. 3. Сервер отправляет ответ клиенту, не ожидая получения ответа из очереди
У Сенека есть опция под названием timeout
. Если наш запрос к другому микросервису не будет выполнен в определенное время, наш запрос будет прерван. К сожалению, очередь от BullJS не отлавливает никаких ошибок, если есть тайм-аут для запроса Seneca. И наши задачи будут иметь состояние active
, пока они не преобразуются в состояние stalled
, а затем преобразуются в failed
. Мое личное мнение, что задачи с ошибкой тайм-аута должны быть преобразованы из состояния active
в failed
. Я пытаюсь установить параметр timeout
в очереди, но он также не работает. Как отловить ошибки таймаута Seneca в очереди? Я пользуюсь Сенека - 3.11.0, Бык - 3.11.0
// queue.ts
export const queue = createQueue(queues[0], {
redis: queues[0],
defaultJobOptions: {
timeout : 1000 * 60 *5, // 5 minutes
removeOnComplete: false,
removeOnFail: false,
},
});
export function createQueue(queueParams: any, options: QueueOptions) {
const queue: Bull.Queue = new Bull(queueParams.name, options);
queue.process((_job: Job, done: any) => done());
return queue;
}
addTask(
queue,
'doSomeTask',
20,
(data: any) => seneca.act({
role: 'MainAPI-Main',
cmd: 'doSomeTask',
...data,
timeout$: 5,
}),
);
export function addTask(
queue: Queue,
taskName: string,
maxParallelJobs: number,
cb: Function,
) {
queue.process(taskName, maxParallelJobs, async (job: Job, done: any) => {
try {
const result = await cb(job.data);
done(null, result);
} catch (error) {
if (!!error.error === true) {
const { error: err } = error;
const resultError = new Error(`${err.message}: ${err.error_details}`);
done(resultError);
return;
}
done(new Error(error.message || error));
}
});
}