求助:nodejs服务在高并发情况下数据错乱
发布于 3 年前 作者 759729757 4036 次浏览 来自 问答

项目服务端用的nodejs,在高并发(1000人同时访问)情况下会出现返回用户数据错乱的问题; 项目调用了微信登陆接口,微信结果返回后,将用户信息(用户id等)用 jsonwebtoken 签名成token返回客户端,客户端每次请求都会在请求头带上该token。服务端解析token获取用户id等敏感信息后再从mongodb数据库中获取信息返回客户端 高并发情况下,同样的token,后端返回的数据偶尔出现错乱,用户A拿到的是用户B的数据。在访问人数不多的情况下又不会出现该问题,生成的token值应该是不会重复的。 服务器用的Window serve 2012 用IIS反向代理到node服务,node服务用forever守护进程。

这是生成token的代码: ** let content = { _id: user._id }; // 要生成token的主题信息 let secretOrPrivateKey = global.tokenKey;// 这是加密的key(密钥) let token = jwt.sign(content, secretOrPrivateKey, { expiresIn: 60 * 60 * 4 // 4小时过期 }); res.jsonp({ status: 1, mess: ‘ok’, token: token, }) //返回token**

这是解密token的中间件: let token = req.get(“Authorization”); // 从Authorization中获取token let secretOrPrivateKey = global.tokenKey; // 这是加密的key(密钥) jwt.verify(token, secretOrPrivateKey, (err, decode)=> { if (err) { // 时间失效的时候 || 伪造的token res.send({‘status’:0,mess:“登录超时,请重新进入”}); } else { req.query.userInfo = decode;//记录解析出来的数据 next(); } })

**有大佬遇到过类似的问题么?困扰我很久了,望解答,下面附上部分代码,谢谢~!**
12 回复

这就是并发扛不住了,加机器资源吧

不经代理,直接请求nodejs 会数据错乱吗?

打好日志,复现一下应该就知道了,一般不是node的问题

你这点并发一台机器足够的,看你的描述“同样的token,后端返回的数据偶尔出现错乱”,我怀疑是全局变量或者缓存

可能是处理微信登陆的返回的问题,在并发较高的情况下,回掉处理接口处理了不是当前用户的回掉,导致返回了错误的token。

同样的token,接下来就是追踪解析出来的userinfo是不是一样,数据库的数据是不是一样,一点一点追踪呗

还是代码有漏洞,导致数据获取串了。 看看是不是异步并发请求处理不对,导致请求微信之后获取的数据与请求前顺序不匹配?

感觉应该是返回错误token的问题

@dingyuanwu 那么应该如何避免这个问题呢

@759729757 可以用同步锁解决

@759729757 通过这几行代码看不出来问题。可以提供一个思路进行排查 1、异步编程要多考虑“代码重入”的问题。比如,同样一段代码,当await执行某些io时,其他用户环境的io先执行完,会重入到这段代码中。 2、因为“代码会重入”,所以变量的声明和使用要多注意。多建议用局部变量或者ctx环境变量,如果一定要用类似全局状态的变量,就要考虑重入的影响

@zhennann 这个问题,我也遇到了,感谢提点

回到顶部