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!
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