Mongo db操作在兔子mq使用者中越来越饿。
rabbitConn.createChannel(function(err, channel) {
channel.consume(q.queue, async function(msg) {
// The consumer listens to messages on Queue A for suppose based on a binding key.
await Conversations.findOneAndUpdate(
{'_id': 'someID'},
{'$push': {'messages': {'body': 'message body'}}}, function(error, count) {
// Passing a call back so that the query is executed immediately as mentioned in the
// mongoose document http://mongoosejs.com/docs/api.html#model_Model.findOneAndUpdate
});
});
});
问题是,如果队列中没有更多消息,则正在读取大量消息时,mongo操作将变得饥饿并执行。因此,如果队列中有1000条消息。首先读取1000条消息,然后再调用mongo操作。
回答:尝试将工作人员从主线程中分离出来是没有帮助的。
答案:不能帮助10个工作线程从队列中读取数据,仅在没有更多要读取的队列时才执行findOneAndUpdate。
任何帮助将不胜感激。
谢谢
答案 0 :(得分:0)
根据问题的描述,我认为您没有任何消息排队的情况。当队列中有一堆消息,然后将auto-ack
设置为true且没有预取计数的使用者订阅时,可能会发生这种情况。 This answer详细描述了这种情况下发生的情况。
如果我不得不猜测,我会说javascript代码会花费所有分配的周期从代理下载消息,而不是将其处理到Mongo中。添加预取计数,同时禁用自动确认可以解决您的问题。