昨天发现线上游戏后台开关出了问题,吓得我赶紧去看一下。习惯性上主节点打印出ets发现ets存的数据都对但是登录游戏却看到到时间关的活动没关到。。。怀疑了一下人生后,决定上2节点看一下,发现1节点的ets上存的活动确实关了,但是2节点上的还是开着的,吓得我赶紧看一下代码,发现以前的大兄弟写的是跨天时每个节点自己加载一下模板表,算一次自己的活动开关。后续的开关变化都由主节点通知。想了各种情况最后发现是每个节点拿的时间戳是不同的。如果都是拿系统时间就不会有问题的,但是当初设计的时候erlang都是启动的时候自己内部计算自己的时间戳的,所以开的久的节点是有可能会造成时间误差的。上面后台开关出现的问题是主节点的时间是正确的但是副节点的时间确跑慢了,本来该关的活动只有主节点关了。而跨天的时候又是每个节点自己算自己的所以在主节点上已关的活动不会再通知副节点去关了。。。(解决办法,跨天后由主节点通知副节点同步一份主节点最新的数据)。eg(当初用ets不用进程字典是考虑到了效率问题,不用每次取时间戳都去call主节点所以才用了ets)
erlang节点时间问题
最新推荐文章于 2022-03-17 09:59:17 发布