这次再次review之前优化的增量同步机制,因为架构是多线程多虚拟机,虚拟机里是协程并发,那么可能会出现两个协程会先后操作同一份数据,时序上有先后。现在的策略是玩家数据一分钟的细粒度增量更新变化的数据,五分钟粗粒度的全量更新数据,不管有没有变化,防止因为意外问题造成数据回档。
但是今天在车上仔细想想好像有点问题,如果增量更新和全量更新的定时器同时触发,而且定时增量更新的数据更新,那么可能出现先进行全量更新后进行增量,此时数据是没问题的,因为同步到DB那边后就是串行操作,后到的覆盖之前的。
如果先增量更新,后全量更新,那么新数据会被覆盖,就有问题。仅这个时间段内出现不一致,因为后面玩家下线,还是以最新的全量更新到DB,达到数据最终一致性,中间可能会出现暂时性的不一致。
为了尽量达到实时的一致性,现在在原来的基础上增加版本号version字段。版本号仅用于增量,当有数据增量到来时,先拿本地版本号和更新版本号对比,如果落后则丢弃本次增量数据,否则append要增量的数据等增量定时器到来。
全量更新的时候,更新增量的版本号,并且重置即将增量的更新,以全量更新为准,这样增量定时器到来后,就不用更新,防止旧的增量同步数据覆盖最新的数据。
这里增量版本号用于控制是否继续保存要增量的数据,要保存则更新,而增量数据是否重置由全量那边处理,这么考虑是以全量为最新数据。













网友评论