Управление с BullJS и SenecaJS - PullRequest
       21

Управление с BullJS и SenecaJS

0 голосов
/ 04 октября 2019

У нас есть проект, построенный на микросервисах. Для сообщений между микросервисами мы используем 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));
    }
  });
}

...