锁定存储在 req.session 中的变量,或者创建一个巨大的全局变量?

Lock a variable stored in req.session, or make a huge global var?

我正在 node.js 编写游戏,基本上,你发送任务中的单位并等待他们 return。当然,你不能在两个任务中派出同一个单位,也不能在同一个任务中派出两套单位。

玩家拥有的每个单位都存储在req.session(快速会话)中,所以在开始任务之前,我检查它们是否在使用中,如果是,则中止任务,如果空闲,标记它们在使用中并继续。

这就是问题所在,我不知道 req.session 是否共享,或者每条路线是否都有自己的副本,并且无法可靠地将它们标记为正在使用。

我试过信号量(npm 模块'locks'),但结果是一样的。

这里是(截取相关部分)日志:

E:\Documents\GIT\_>node app.js
2015/6/15 23:51:55:582  /start          get
2015/6/15 23:51:55:582  /start          parameters:
        squad: 0,1
        mission: 1
2015/6/15 23:51:55:612  start_miss      squad locked
2015/6/15 23:51:55:613  start_miss      Waiting

2015/6/15 23:51:56:73   /start          parameters:
        squad: 0,1
        mission: 1
2015/6/15 23:51:56:75   start_miss      squad locked
2015/6/15 23:51:56:76   start_miss      Waiting

2015/6/15 23:51:56:625  end_missio      End mission
2015/6/15 23:51:57:88   end_missio      End mission

这是我的 "lock_squad" 代码:

function lock_unit(req, squad, callback, i) {
    setImmediate(function () {
        if(!i) {i = 0;}
        log(log_level['DEBUG'], 'lock_unit', 'start ' + (i + 1) + ' / ' + squad.length);
        if(i < squad.length) {
            search_id(req.session.units, squad[i], function (id) {
                req.session.units[id].deployed = true;
                lock_unit(req, squad, callback, i + 1);
            });
        } else {
            callback();
        }
    });
}

基本上,问题是:

如何锁定一个变量(存储在会话中的数组中的元素),以便在处理请求之前该对象不能被另一个或同一路由使用?

编辑:

似乎 req 是一个副本,所以我应该更改我的实现以给每个会话一个 id,并将该 id 用于 link 包含每个会话的每个单元的全局变量,并锁定它.这对我来说似乎是个坏主意,因为要么节点进程会占用大量内存,要么我需要手动创建一个 "garbage collector",每个陷阱都会产生。

有人有更好的主意吗?

res.end() 上快速保存会话,在我的例子中,这是在看到第二个请求后很长时间才发送的。

这意味着我仍然需要锁定会话(a la redis-lock,需要找到 mongoDB 等价物),并在开始计算战斗之前结束 res。