2017-03-31 4 views
0

Ich bin ein Hintergrund-Task-Management-System mit Rabbitmq und Nodejs mit dem amqlib-Modul.AMQPlib nodejs Consumer-Task Nebenläufigkeit

Einige der Aufgaben sind wirklich CPU-aufwendig, also wenn ich viele von ihnen starte und nur wenige Arbeiter habe, kann mein Server getötet werden (mit zu viel CPU).

Ich frage mich, ob es eine Möglichkeit gibt, eine amqp-Warteschlange zu erstellen, so dass meine Kunden nur eine Aufgabe dieser Warteschlange gleichzeitig verbrauchen (dh vor einer Bestätigung oder einer Zurückweisung, senden Sie keine Aufgabe dieser Art) zu diesem Verbraucher). Oder sollte ich das selbst im Code behandeln (vielleicht einen Verweis in meinem Worker behalten, dass ich eine Aufgabe dieser Warteschlange handhabe und alle Aufgaben dieser Warteschlange ablehne, während ich die Aufgabe ausführe?).

Hier ist mein Beispielcode:

Ich bin der AMQP-Verbindung wie dieser Name ist tasks

const amqpConn = require('amqplib').connect('amqp://localhost'); 

Meine Warteschlange zu erstellen:

amqpConn.then((conn) => { 
    return conn.createChannel(); 
}).then((ch) => { 
    return ch.assertQueue('tasks').then((ok) => { 
    ch.sendToQueue(q, new Buffer(`something to do ${i}`)); 
    }); 
}).catch(console.warn); 

Und hier ist mein Verbraucher (I denke, das ist, wo ich die Arbeit tun sollte, um nur eine gleichzeitige Aufgabe dieser Warteschlange zu begrenzen):

amqpConn.then((conn) => { 
    return conn.createChannel(); 
}).then((ch) => { 
    return ch.assertQueue('tasks').then((ok) => { 
    return ch.consume('tasks', (msg) => { 
     if (msg !== null) { 
     console.log(msg.content.toString()); 
     ch.ack(msg); 
     } 
    }); 
    }); 
}).catch(console.warn); 

Vielen Dank!

+1

Es ist eine Weile her, seit ich mit RabbitMQ gearbeitet habe, aber sieh dir das an (http://www.squaremobius.net/amqp.node/channel_api.html#channel_prefetch). – robertklep

Antwort

1

I'm wondering if there is a way to create an amqp queue so that my consumers will only consume one task of this queue at a time

Wenn das ist, was Sie wirklich brauchen, dann ja, einfach genau einen Verbraucher und erklären die Warteschlange aus. Auf diese Weise wird eine Aufgabe zu der Zeit verbraucht.

+0

Danke @cantSleepNow! Ich wusste, dass ich präziser hätte sein sollen;) Ich Fleisch konsumiere nur "eine bestimmte Anzahl" von Aufgaben, nicht unbedingt eine. –

+0

Gern geschehen! – cantSleepNow