Revisé toda la documentación y tengo algunos problemas para encontrar ejemplos de la implementación correcta. En primer lugar, tengo el complemento Heroku Redis como puedes ver a continuación:
https://i.stack.imgur.com/9kcXW.png
Instalé Redis y Bull en mi entorno Node.js y configuré Redis de la siguiente manera:
const redis = require('redis'); const Queue = require('bull'); const redisClient = redis.createClient(process.env.REDIS_URL, { tls: { rejectUnauthorized: false } }); const bullQueue = new Queue('queue', process.env.REDIS_URL)Estoy tratando de ejecutar la siguiente función como una tarea en segundo plano (esto es lo que recomienda Heroku para las funciones que tardan más de 0,5 segundos en completarse):
app.post('/', async function(request, response) { const client = await pool.connect() //pool is just a node-postgres pool try { await client.query('BEGIN') let data = await function1(argumentList); await function2(data); await client.query('COMMIT') } catch(err) { await client.query('ROLLBACK') console.log(err) } try { await client.query('BEGIN') const setOfItems = await function3() var array = [] for (item of setOfItems) { if (conditional) { array.push(item) } } await client.query('COMMIT') let job = await bullQueue.add() response.send(JSON.stringify(array)) } catch(err) { await client.query('ROLLBACK') console.log(err) } });Esta función hace algo de raspado web, llamadas a la base de datos y otras cosas, así que, como dije, tarda unos segundos en completarse. ¿Cómo debo cambiar mi función para agregar la solicitud a la cola de fondo y luego devolver la 'matriz' JSON.stringified al usuario? Lo siento si esta es una pregunta de novato en Redis, pero revisé todos los documentos y realmente no estoy seguro de cómo proceder.
Para empezar, const redis = require('redis'); no es necesario Bull se conecta a Redis bajo el capó, por lo que solo necesita proporcionar process.env.REDIS_URL para Heroku mientras lo hace. ( heroku config | grep REDIS devuelve las URL de punto final si es necesario)
Actualmente, todo el código de su base de datos no se delega en absoluto a la cola de tareas. Intente registrar una función de procesamiento asociada con la cola usando
bullQueue.process(job => {/* your database work goes here */}) El job de parámetros debe completarse con cualquier dato serializable que su trabajador necesite para hacer su trabajo. Rellena este parámetro usando
bullQueue.add(/* job data goes here */)Un enfoque de alto nivel podría ser algo como:
const Queue = require('bull'); const bullQueue = new Queue('queue', process.env.REDIS_URL) bullQueue.process(async job => { console.log(job.data.argumentList); /* do SQL stuff */ return [1, 2, 3, 4]; }); app.post('/', async (request, response) => { const job = await bullQueue.add({argumentList: ['some', 'data']}); const array = await job.finished(); response.send(JSON.stringify(array)) });Existen muchas otras estrategias para obtener los resultados. Consulte las finalizaciones de trabajos recurrentes para obtener algunas ideas.
Ver también: