我的应用程序基于Nodejs
+ Mongodb
+ amqp
。核心模块从amqp
接收消息,然后将其包装到相应的消息事务中。在消息事务中,将消息信息保存到mongodb
和其他一些逻辑中。
function messageReceiverCallback(msg) {
try {
messageHandler(decode(msg));
} catch (ex) {
}
}
function messageHandler(msg) {
function defaultTransaction() {
}
var dispatch = {
'default': defaultTransaction
}
dispatch[MSG.TYPE1] = Msg1Transaction;
// other message transaction here
return (dispatch[msg.type] || dispatch['default'])(msg);
}
function Msg1Transaction(msg) {
// some mongodb operation here...
}
但是,当amqp
队列中存在多个具有不同消息字段值的相同类型消息时,将调用messageReceiverCallback
,并且还会多次调用Msg1Transaction
。因此,mongodb
中保存的数据将不正确,因为我忽略了mongodb
上的异步操作。 在这种情况下如何处理?
我有一个想法,可能添加一个包含Promise
的新事务队列。因此可以异步处理事务。但我不知道如何实施呢?可以帮助我或其他一些更好的解决方案吗?
答案 0 :(得分:1)
我不熟悉amqp
,但是如果我理解了您的问题,那么messageHandler
操作完成后您希望mongo
返回。在这种情况下,正确的逻辑是:
function messageReceiverCallback(msg) {
try {
messageHandler(decode(msg));
} catch (ex) { ... }
}
function messageHandler(msg) {
Msg1Transaction(msg, callbackAfterTransaction);
}
function callbackAfterTransaction(data){
// update transaction info
}
function Msg1Transaction(msg, callback) {
// some mongodb operation here...
Collection.find ({},
function(err, data)
{
...
callback(data);
}
}