Juya Cai

时间同步机制

读者知道游戏客户端连接游戏服务端发送的第一个请求是什么吗?没错,是发送一个请求以获取服务端的发送回复的时间戳。这个请求的逻辑很简单,客户端发送ServerTime请求,服务端收到请求,将收到请求的时间戳写入回复中发送给客户端。读者知道这个请求的目的是什么吗?还有,服务端会客户端的每个请求的回复都会带上时间戳。这两件事都是为了同一个目的:分布式时间同步。 时间同步机制 网络一定存在延迟性,...

基于actor框架的开箱即用的游戏服务框架开源项目开启动声明

转眼进入游戏开发行业已经三个多月了,笔者身处的领域是游戏后端开发;虽然只是实习,但是对于游戏后端开发领域的一些现状有一些想法。读者可以把这篇文章当做吐槽文哈哈哈。 与互联网后端的差异 大学期间,笔者接触的大多是互联网后端相关和底层工具的开发,对游戏后端不甚了解,在有幸进入该领域后发现与互联网存在比较大的差异。 互联网后端服务大多是无状态的,从客户端传来的数据不会在内存停留太久,处理完后...

记录发现压力测下任务队列丢失消息的问题

问题发现 使用之前的任务队列,发现服务器在负载高的情况下,会出现协程死锁的情况(协程无法正常退出,一般表现为空转循环)。刚开始怀疑是任务调度出现问题,怀疑任务数和队列实际len不一致导致的任务调度器一直认为存在任务,导致忙转。 针对这个问题也进行了一些处理,但是后面发现是底层环形队列存在实现上的问题。环形队列push操作,在检查到len == size后,会触发扩容。扩容逻辑存在错误,会导...

任务队列设计与实现

如果读者所在的领域是后端,应该对消息队列并不陌生。存在这样一种队列,它内部也是消息队列,但会对消息执行处理函数,这样的队列就被称为任务队列。 为什么要在本篇文章介绍任务队列呢?可能大部分读者认为任务队列的作用就是提供异步执行的手段,其实并不然,任务队列甚至可以成为系统并发机制的核心。这并不是本篇文章介绍的重点,笔者会在之后的文章中介绍如何依托任务队列来实现系统的并发机制。 任务队列 先...

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

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

异步通知的实现

前言 有这样一个需求,需要对用户进行消息通知,如果用户在线就立即通知,如果用户不在线需要把通知缓存起来等待用户上线后异步通知。这样的异步通知在游戏,通讯中是非常常见的需求。 这里介绍几个常见的解决方案。 消息持久化方案 在检测到用户并未在线时,将消息和消息内容持久化到数据库中,等待用户上线时,查表建立通知操作,通知用户消息。通知完删除记录。 type Notify struct { ...

指针本身的同步问题

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

通用背包设计范式以及背包数据持久化思路

笔者这几天在开发背包系统,调研了一些背包系统常规的设计思路,这里做下总结和思考。 分布式思路 背包系统是能够被抽象成单独的服务、为多个游戏提供服务的,因为背包系统所需要的功能对于大部分游戏来说是差不多的,无非是对道具的增删查改,过期检查,装备卸下等功能。如果能够抽象成单独的服务,对外开放接口,这样就能提高游戏系统的复用率,降低维护成本。所以后面的设计思路都将围绕这个主题进行设计展开。 通...