2017-03-31 137 views
0

我正在使用amqlib模塊構建帶有rabbitmq和nodejs的後臺任務管理系統。我的服務器可能會被殺死(使用太多的CPU)。如果我啓動了很多這些任務,並且我只有幾個工作站,那麼我的服務器可能會被殺死(使用太多的CPU)。AMQPlib nodejs消費者任務併發

我想知道是否有辦法創建一個amqp隊列,以便我的消費者一次只能使用此隊列中的一個任務(即在確認或拒絕之前,請不要發送此類任務對這個消費者)。 或者我應該在代碼中自己處理這個問題(也許在我的工作人員中保留一個引用,我正在處理該隊列的任務,並在執行任務時拒絕此隊列的所有任務?)。

這裏是我的示例代碼:

我創造這樣的

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

我的隊列名稱的AMQP連接tasks

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); 

這裏是我的消費者(我猜測這是我應該做的工作,以限制此隊列中只有一個併發任務):

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); 

非常感謝!

+1

自從我和RabbitMQ合作已經有一段時間了,但是看看[在此](http://www.squaremobius.net/amqp.node/channel_api.html#channel_prefetch)。 – robertklep

回答

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

如果這是你真正需要那麼是,只要有一個確切的消費者,並宣佈獨家隊列。這樣就消耗了一項任務。

+0

謝謝@cantSleepNow!我知道我應該更精確;)肉只消耗「一定數量」的任務,不一定是一個。 –

+0

不客氣! – cantSleepNow