如何处理nodejs中的并发问题

时间:2015-04-18 02:37:53

标签: node.js callback socket.io node-mongodb-native

我正在使用socket-io在nodejs上准备聊天应用程序 问题是并发回调,解释如下: 我保留在相关用户的数据库socketId中, 在socket-io的disconnect事件中,我根据mongodb的socket.id找到用户,并执行一些db操作,从订阅者套接字列表中删除socket.id并更新同一列中的列表(mongodb中的数组)。 现在的问题是何时有并发请求。

所有回调都找到了socketId 然后所有的回调都创建了自己排除的socketids列表(事件是断开连接),然后所有更新都返回到db。

这个approch中的问题是,即使结果是空白列,我最终会使用socketIds,但只删除了一个。

希望能够解释。谁能告诉我这里我做错了什么?这似乎是一个非常普遍的问题,解决它的标准方法是什么。??

代码snippit:

if(sSocketIds.length > 1){
                    console.log("{disconnect} session contains multiple socket processing for removing the current one");
                    var nSubscriberSocketids =  [];
                    for(var cnt=0 ;sSocketIds.length>cnt ; cnt++){
                        if(sSocketIds[cnt]!=socket.id){
                            nSubscriberSocketids.push(sSocketIds[cnt]);
                        }
                    }
 // This below line is problem I always end up with n-1 socketIds due to concurrency.

                    __db.SessionFrame.update({"_id":session._id },{"subscriberSocketIds":nSubscriberSocketids}, function(err,count){
                        if(err){
                            console.error("{disonnect} error while removing socket: "+socket.id);
                        }else{

                            console.log("{disconnect} subscriber socket removed successfully: socketId: "+socket.id+" session will still persist");

                        }

                    });
                }

0 个答案:

没有答案