发现nodejs一个获取时间的bug
发布于 5 年前 作者 chxy85 2582 次浏览 来自 问答

最近在研究网易出的pomelo。平台是win10.版本是8.11.3 启动框架,什么也不做,随机过几分钟会打印某个服务器心跳超时,然后会断开其中一台服务器。

仔细跟了下,发现log如下: [2018-12-06 19:11:38.796] [INFO] console - timer master-server-1 update lastPing time: 1544094698796 [2018-12-06 19:11:38.793] [INFO] console - timer master-server-1 update lastPong time: 1544094698793

其中lastPing是发送心跳,lastPong是接受心跳。问题就出在最后的时间戳上。 可见第一个发送心跳的时间戳反而比接受更晚。最前面的时间是console.log()自己写的也会有这个问题。但是log的写入顺序是正常的,因此不像是异步的问题。 感觉win下node在通过Date.now()获取当前时间时有bug,因此导致后面比较时间戳时出现了问题关掉socket。 我用new Date().valueOf()或者其他方法。都会有这个问题,并且最新的10.x.x也有。

最最最重要的是,这个问题在linux上不会出现,无论挂多久都不会。。。

说实话不敢相信获取系统时间这么常用的功能,node怎么会都有问题。 请大神看看。

4 回复

这个跟常用不常用无关,定时任务也很常用,但是win 就是没crontab 这样的。 生产环境一定用linux! 生产环境一定用linux! 生产环境一定用linux! 首先要知道一点,win32 API 跟 linux 的API 是完全不同的,就如开头所说的定时任务一样。 node.js 跨平台,向开发者提供了一致的 API ,这并不代表底层实现是完全相同的。 所以你永远不知道 node.js 为了统一API 在win上做了什么样的转换。

拿时间戳来说,请问以下哪个时间戳跟linux 上时间戳是一致的? 请问以下哪些时间戳兼容 XP ?

  1. CRT 的time()函数
  2. Win API 的GetTickCount() ,GetTickCount64()
    3 .Wimm.lib 的timeGetTime()
    对,就是这么基本的东西都无法保持一致

被win的node撞了一下腰。 之前也遇到过这个问题,我还以为是log4js的问题就没当回事…

GetTickCount() / GetTickCount64() / timeGetTime() 都是返回 操作系统启动以来所经过的毫秒数 ,与绝对时间戳并没有什么关系。。

至于楼主的问题,猜测可能是与CPU多核有关,参考一下这里:https://blog.csdn.net/bearcoding/article/details/51860058

回到顶部