Juya Cai

记录一次更版数据库表结构发生变化导致的线上问题

前言 问题发生的场景是这样的,已上线项目的数据库表结构在二期需求中发生了变化,并且二期需求部分功能依赖于新增的表字段,导致系统运行时,出现数据的不一致。 数据出现不一致的原因是这样的,二期需求对表提出新的要求,要求表中存在唯一索引key,而且后面对表数据的获取也是通过这个唯一索引key来进行。测试时,发现原先的表中存在的数据的key值为null,并且无法保证其唯一性,并且无法获取(通过k...

分布式消息通知和单机异步通知的实现

分布式消息通知 套件需要实现的功能是这样的:存在一单点服务能够生产消息,消息生产后希望广播到所有的订阅者中处理该消息。经典的订阅广播模型(一对多)。业务场景是这样的:第三方平台产生一条道具发放的消息,携带道具发放的相关信息(能够定位到消费者的服务器位置,但是消息队列不知道消费者的位置)。希望这条消息能够被指定的服务消费处理。 在分服架构下,玩家可能位于不同的服务器。每个游戏服务启动时,向消...

指针本身的同步问题

问题发生的场景 用户可能有两个不同的结构体或变量,每个都保存着自己的指针,现在需要这两个指针变量本身在修改时保持同步。这种情况下,如何让两个独立的变量在修改时互相通知并更新? 两个指针本身被修改了,比如重新指向其他地方,这样就会导致两个内存块中的指针不再同步。比如,假设内存块A和B各自保存一个指针,指向同一个数据对象。如果通过内存块A的指针修改了数据,那么通过B的指针访问时,数据应该已经改...

通用背包设计范式以及背包数据持久化思路以及微服务化探索

笔者这几天在开发背包系统,调研了一些背包系统常规的设计思路,这里做下总结和思考。 通用道具设计以及配置表实现自定义化 所谓背包系统,对用户拥有的道具信息进行管理和操作,包括对道具的增删查改,道具有效期检查、道具信息持久化等。 首先我们需要设计道具表的数据结构,站在背包的视角,所有的道具理论上都可以使用四个字段来描述: type Prop struct { PropId stri...

分布式挤号问题

需求 在分布式环境下,多台服务器后端处理用户连接,对于用户连接可能会打到不同的服务器上。在这样的条件下,如何实现用户异地登录挤号的需求呢。用户异地登录,登录请求可能会打到另外一台服务器上,分布式系统如何将旧的在另一台服务器的用户连接给断开,接受新的登录连接呢? 实现方案 redis+消息队列实现 首先我们来分析需求制定方案。不允许用户同时登录在多台服务器上,也就是登录具有唯一性。自然而然...

分布式服务器房间匹配问题

之前接触的业务的玩家加入房间都是自带房间id,不走匹配这个逻辑。但是最近遇到没有房间id,需要在一段匹配时间内的匹配房间,需要实现分布式的匹配房间逻辑,故写此文章记录开发历程。 全局匹配节点 客户端加入房间请求需要携带roomid,但是没有roomid需要前往匹配节点进行匹配获取roomid。匹配节点通常与我们熟知的大厅服务器放在一起。服务端单独开个匹配房间的接口,客户端检测到玩家点击开始...

游戏后端内存和持久化的一致性问题

引发这个问题的思考是来自开发中的一个问题。场景是这样的,中台向游戏服务端发放用户的道具,服务端收到发放用户道具请求时,需要解决下面几个问题: 用户在线和不在线的处理区别 用户在线时收到道具的客户端通知和状态同步 用户在线和不在线的处理区别 用户的状态数据在内存中有一份、在硬盘中有一份。客户端的状态通常依赖于内存中的用户信息,也就是内存数据和硬盘数据的更新存在延迟性。为了提高...