先说下背景,服务端记录玩家行为,数据入库oracel,用于分析,记录玩家id、tm、action以及其它一批需要用到的数据,大概长这样:
运营的设想是这样的,每次游戏登陆服务器记录一条login,每次退出游戏记录一条logout,然后可以通过logout-login来统计每次游戏长,再按天或按生命周期去累加数次游戏时长;
然而事情并不是这样的,听我一一道来:
并不是这样子之一:
同一秒内,竟然出现多条login和logout,这样我只能根据入库时间来判断哪条action在前,结果并不科学,因为我们是通过redis入库,压根不可控;
应对方案:
修改login记录的时机,修改为登陆网关时记录,同时排查bug,修复同一秒内记录多条action的问题;
并不是这样子之二:
多条login对应1条logout,说白了,就是某些原因导致logout没有正常记录到(比如闪退啥的);
应对方案:
改bug呗,还能怎么样;
并不是这样子之三:
跨天的情况怎么办?今天23:50分login,明天2:00才logout,全局统计似乎并没有问题,可是分天统计不是乱套了么;
应对方案:
1、以每天24点为节点吧,默认为在当天23:59:59logout了,用这个时间减去当天最后一次login,形成一一对应,计算在线时长,这样就能保证当天的数据正常了;
2、那跨天的第二天呢?每天0点对所有在线玩家强制写一条login吧(当然别一次性写,如果在线高会对服务器产生影响),这样就不会出现,跨天时只有logout,没有login的情况了;
并不是这样子之四:
肿么某个时间段大批玩家只有login没有logout呢,原来是服务器重启了或者停服维护造成的;
应对方案:
服务器重启和停服前数据存档的过程中给所有在线玩家加一条logout吧
tips:
这两条action还是很重要的,至少对于我们游戏来说,统计活动、留存、游戏时长都依赖于斯,所以需要慎重慎重,不能出差错;