Mongo Operations挨饿

时间:2018-07-11 09:06:16

标签: javascript mongodb mongoose rabbitmq

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操作。

  1. 将在不同的nodejs流程中运行工作程序吗?

回答:尝试将工作人员从主线程中分离出来是没有帮助的。

  1. 我还写了一个由10名工作人员组成的负载均衡器,但这似乎无济于事,事件循环是否没有优先考虑mongo操作?

答案:不能帮助10个工作线程从队列中读取数据,仅在没有更多要读取的队列时才执行findOneAndUpdate。

任何帮助将不胜感激。

谢谢

1 个答案:

答案 0 :(得分:0)

根据问题的描述,我认为您没有任何消息排队的情况。当队列中有一堆消息,然后将auto-ack设置为true且没有预取计数的使用者订阅时,可能会发生这种情况。 This answer详细描述了这种情况下发生的情况。

如果我不得不猜测,我会说javascript代码会花费所有分配的周期从代理下载消息,而不是将其处理到Mongo中。添加预取计数,同时禁用自动确认可以解决您的问题。