Как мне выполнить мои функции в качестве фоновых процессов в Node.js с Bull? - PullRequest
0 голосов
/ 16 апреля 2019

У меня есть веб-приложение Node.js, в котором я выполняю некоторые сторонние API-вызовы, создавая очень длительное время запроса / ответа.Это приводит к тому, что время ожидания моего Heroku составляет ~ 50% времени, и, согласно документам Heroku, нет никакого способа изменить это жесткое ограничение.Они рекомендуют использовать фоновые процессы для масштабирования, и это кажется подходящим решением проблемы (они предоставляют примеры и рекомендуют использовать https://optimalbits.github.io/bull/).

. Я следую простому примеру, представленному Heroku здесь https://github.com/heroku-examples/node-workers-example), однако, ради меня, этот пример слишком прост.

У меня есть файл с именем worker.js, который будет моим рабочим. Есть функция start(), которая создает очередь и сообщаеточередь, как обрабатывать задания. Моя проблема в том, что я буду добавлять задания в очередь через свои конечные точки API, и я хотел бы, чтобы каждое задание выполняло определенные функции для выполнения своей задачи.

Вотstart() function:

function start(){
 let workQueue = new Queue('work', REDIS_URL);
  workQueue.process(maxJobsPerWorker, async (job,data) => {
    return {message: "Finished"};
  });

Я хотел бы выполнить различные функции в логическом блоке вместо возврата готового сообщения. Например, я хотел бы сделать что-то вроде этого:

function start(){
 let workQueue = new Queue('work', REDIS_URL);
  workQueue.process(maxJobsPerWorker, async (job,data) => {
    return someFunction();
  });

Опять же, этого было бы достаточно просто, если бы мне нужно было запускать одну и ту же функцию каждый раз, но я буду запускать несколько разныхфункции, которые используют разные входы.Так что someFunction является переменной, а не константой.

Я думал о передаче имени функции для непосредственного выполнения в задание, что-то вроде этого: let job = await workQueue.add({ callback: functionName });

Однако я могудействительно не скажу, работает ли это или нет ... Как я могу получить это и работает?

1 Ответ

0 голосов
/ 16 апреля 2019

Я не думаю, что функция запуска необходима.Вы можете просто определить свои функции следующим образом: async function myFunction(){ //Logic goes here }, а затем, когда вам потребуется этот вызов, вы просто выполняете их, используя await myFunction(), или из них возвращается то, что вы можете поместить в переменную.Но функция, которую вы хотите выполнить, должна содержать слово async, чтобы await работал.

Также return работает так же, как и ожидание.Итак, вы можете сказать, что у вас есть метод получения, который вы можете сказать что-то вроде async function findWorker(){ return database.find({ workerId }); };.

...