记录一次更版数据库表结构发生变化导致的线上问题
前言 问题发生的场景是这样的,已上线项目的数据库表结构在二期需求中发生了变化,并且二期需求部分功能依赖于新增的表字段,导致系统运行时,出现数据的不一致。 数据出现不一致的原因是这样的,二期需求对表提出新的要求,要求表中存在唯一索引key,而且后面对表数据的获取也是通过这个唯一索引key来进行。测试时,发现原先的表中存在的数据的key值为null,并且无法保证其唯一性,并且无法获取(通过k...
前言 问题发生的场景是这样的,已上线项目的数据库表结构在二期需求中发生了变化,并且二期需求部分功能依赖于新增的表字段,导致系统运行时,出现数据的不一致。 数据出现不一致的原因是这样的,二期需求对表提出新的要求,要求表中存在唯一索引key,而且后面对表数据的获取也是通过这个唯一索引key来进行。测试时,发现原先的表中存在的数据的key值为null,并且无法保证其唯一性,并且无法获取(通过k...
分布式消息通知 套件需要实现的功能是这样的:存在一单点服务能够生产消息,消息生产后希望广播到所有的订阅者中处理该消息。经典的订阅广播模型(一对多)。业务场景是这样的:第三方平台产生一条道具发放的消息,携带道具发放的相关信息(能够定位到消费者的服务器位置,但是消息队列不知道消费者的位置)。希望这条消息能够被指定的服务消费处理。 在分服架构下,玩家可能位于不同的服务器。每个游戏服务启动时,向消...
问题发生的场景 用户可能有两个不同的结构体或变量,每个都保存着自己的指针,现在需要这两个指针变量本身在修改时保持同步。这种情况下,如何让两个独立的变量在修改时互相通知并更新? 两个指针本身被修改了,比如重新指向其他地方,这样就会导致两个内存块中的指针不再同步。比如,假设内存块A和B各自保存一个指针,指向同一个数据对象。如果通过内存块A的指针修改了数据,那么通过B的指针访问时,数据应该已经改...
笔者这几天在开发背包系统,调研了一些背包系统常规的设计思路,这里做下总结和思考。 通用道具设计以及配置表实现自定义化 所谓背包系统,对用户拥有的道具信息进行管理和操作,包括对道具的增删查改,道具有效期检查、道具信息持久化等。 首先我们需要设计道具表的数据结构,站在背包的视角,所有的道具理论上都可以使用四个字段来描述: type Prop struct { PropId stri...
为了准备即将到来的秋招,本篇文章主要讲解acm输入输出模式,这是因为秋招笔试中大部分笔试都要求我们进行acm模式的输入输出,而不是核心代码模式。 由于本人习惯使用cpp来刷题,所以本篇的acm输入输出模式的介绍也是cpp模式。 整型数组输入 示例: 3 1 2 3 int main() { int n; cin >> n; vector&...
为全局变量的获取设计Get函数,全局变量的初始化函数返回这样的Get函数。 首先是Get函数的设计 func Get[T any] func() T func (getter Get[T]) Get() T { return getter() } 假设现在有全局变量GloabalVar, 设计其初始化函数。 func InitGloabalVar(params ...any)...
需求 在分布式环境下,多台服务器后端处理用户连接,对于用户连接可能会打到不同的服务器上。在这样的条件下,如何实现用户异地登录挤号的需求呢。用户异地登录,登录请求可能会打到另外一台服务器上,分布式系统如何将旧的在另一台服务器的用户连接给断开,接受新的登录连接呢? 实现方案 redis+消息队列实现 首先我们来分析需求制定方案。不允许用户同时登录在多台服务器上,也就是登录具有唯一性。自然而然...
之前接触的业务的玩家加入房间都是自带房间id,不走匹配这个逻辑。但是最近遇到没有房间id,需要在一段匹配时间内的匹配房间,需要实现分布式的匹配房间逻辑,故写此文章记录开发历程。 全局匹配节点 客户端加入房间请求需要携带roomid,但是没有roomid需要前往匹配节点进行匹配获取roomid。匹配节点通常与我们熟知的大厅服务器放在一起。服务端单独开个匹配房间的接口,客户端检测到玩家点击开始...
前情提要:本篇为翻译,原文地址如下: The DOOM III Network Architect The DOOM III Network Architect \ DOOM3网络架构 Abstract \ 摘要 一个能提供玩家快节奏的强交互游戏环境的电脑游戏必须要提供一致的响应及时的体验。然而,在电脑游戏的运行基于网络连接的情况下,这是困难的,因为网络环境充斥着强制因素,比如带宽,信...
引发这个问题的思考是来自开发中的一个问题。场景是这样的,中台向游戏服务端发放用户的道具,服务端收到发放用户道具请求时,需要解决下面几个问题: 用户在线和不在线的处理区别 用户在线时收到道具的客户端通知和状态同步 用户在线和不在线的处理区别 用户的状态数据在内存中有一份、在硬盘中有一份。客户端的状态通常依赖于内存中的用户信息,也就是内存数据和硬盘数据的更新存在延迟性。为了提高...