03 2024 档案

摘要:开发环境(develop):业务开发环境 中控机器(console):管理控制整个线上生产环境机器群 业务机器(produce):承载生产业务进程 数据库机器(database):存盘服务进程 阿里云对象存储服务OSS https://www.alibabacloud.com/help/zh/oss 阅读全文
posted @ 2024-03-31 21:26 linxx- 阅读(11) 评论(0) 推荐(0) 编辑
摘要:如何设计一个生产可用的登录验证流程(C/S模式) 平台SDK(Software Development Kit) 软件中央数据后台(Center Server) 软件服务端(Server) 软件客户端(Client) 渠道平台登录验证(channel login verify) 软件开发期需要依据平 阅读全文
posted @ 2024-03-30 16:48 linxx- 阅读(23) 评论(0) 推荐(0) 编辑
摘要:单个skynet进程,或者说单台机器的承载业务能力是有上限的,对于负责玩家主要业务的节点,横向扩展以提高游戏承载能力是必须的。 对于滚服架构,玩家角色与指定业务节点(单服)固定对应,连接游戏业务前通过中央后台获取到指定信息进行连接。承载能力通过新增单服完成,这里我们只对世界服架构做探讨。 我们将负责 阅读全文
posted @ 2024-03-30 15:54 linxx- 阅读(62) 评论(0) 推荐(0) 编辑
摘要:常有的业务需求场景是一个配置自然时间的多阶段玩法。这里讨论阶段管理逻辑的实现方案。 实现一个排期管理模块,应该解决的问题有: state object:抽象出object原型描述单个阶段的属性,提供 [query, set] API; local object = { _st, -- 阶段号 _bt 阅读全文
posted @ 2024-03-23 20:25 linxx- 阅读(7) 评论(0) 推荐(0) 编辑
摘要:一个需求:控制游戏单服开服接入中央后台,支持定时(指定时间)、定量(当前已开放最新服的已注册数量)的方式; 定时定量开服主要是中央后台功能,游戏服只需要接入控制开服逻辑。那么 中央后台怎么通知游戏服; 通过http协议;(skynet框架提供了http组件的支持,可以方便快速地搭建起来) 对于滚服架 阅读全文
posted @ 2024-03-23 14:29 linxx- 阅读(59) 评论(0) 推荐(0) 编辑
摘要:一些奇奇怪怪的尝试 :)随笔记录下 将golang模块导出为共享库供lua使用(一般用于功能模块适配和迁移),这里给出一个借助c语言实现中间层通信的方案(不要问我为什么不使用ffi)。 假设使用go实现底层模块core,export相关API(如下例的G_Signature)供外部使用,这里是被C层 阅读全文
posted @ 2024-03-23 14:25 linxx- 阅读(41) 评论(0) 推荐(0) 编辑
摘要:存在业务场景,从单点进程(source)批量向集群内其他节点(target)推送消息,目标节点数量可能达三位数。 提供一个实现方案: target上开启进程内的组播服务,只负责当前节点的组播推送业务;服务支持接收其他节点的通知消息(目标服务只在所在节点内的组播服务上做订阅等操作,由该组播服务负责管理 阅读全文
posted @ 2024-03-23 14:23 linxx- 阅读(48) 评论(0) 推荐(0) 编辑
摘要:问题场景是:服务A生产大量请求消息call到服务B,服务B瞬间达到消费能力的瓶颈,导致服务A堆积大量的yield状态协程,服务B消息队列堆积大量待处理消息,业务上出现卡顿、超时甚至物理机器内存吃满被瞬间击穿的问题; 我们使用云服务器产品部署游戏业务,起因是游戏线上收到反馈在某些时间节点频繁出现卡顿延 阅读全文
posted @ 2024-03-23 14:21 linxx- 阅读(34) 评论(0) 推荐(0) 编辑
摘要:当一个执行流程存在对外调用时,我们讨论如何保证流程的可用和安全; 假设流程是关键且强制原子性; -- serviceA function main() step1() skynet.call(serviceB, "lua", "step2") step3() return true end -- s 阅读全文
posted @ 2024-03-23 14:19 linxx- 阅读(21) 评论(0) 推荐(0) 编辑
摘要:这里只讨论单一进程内的只读数据共享。 同一进程内虚拟内存空间是原本就共享的(以C为例),但在业务开发上,一般会嵌入脚本语言,使用VM的沙盒环境独立维护不同的上下文(以lua为例),多个VM之间(暂时称为业务VM)的数据相互独立。 业务上涉及数据共享的,一般的场景是优化性能、资源占用的情况。需要共享的 阅读全文
posted @ 2024-03-23 14:17 linxx- 阅读(26) 评论(0) 推荐(0) 编辑
摘要:我们会有需要自定义加载模块逻辑的需求,比如支持从自定义格式数据包中加载一个被加密过的lua文件的方式,这在生产环境中非常常见,可以有效保护源码同时保持整洁; lua模块管理库会从若干个loader中逐个尝试加载模块,lua原生提供了4个loader; static const lua_CFuncti 阅读全文
posted @ 2024-03-23 14:15 linxx- 阅读(81) 评论(0) 推荐(0) 编辑
摘要:场景是多个c扩展库(for lua)之间需要共享运行时的状态数据,期望是不使用lua逻辑介入; 记录一个方案:通过lua全局注册表 C扩展库中一些数据通过全局注册表放入lua状态机。最方便且能保证唯一性的 key 是一个 light userdata。使用一个static 变量的地址作为 key 在 阅读全文
posted @ 2024-03-23 14:14 linxx- 阅读(7) 评论(0) 推荐(0) 编辑
摘要:c+lua开发中常见的实现:c库实现功能,供lua调用; 比如排行榜模块(跳表),实现方案可为:c库实现跳表(skip list)核心逻辑,提供接口供lua层中操作使用; 那么c库显然有以下的实现(伪码,演示用): // skip list core struct skiplist { // ... 阅读全文
posted @ 2024-03-23 14:13 linxx- 阅读(12) 评论(0) 推荐(0) 编辑
摘要:讨论C++语言中如何将通用逻辑与使用到的频繁变化的具体类型解耦。 假设存在以下设计: /* */ #include <iostream> class Core { public: ~Core(){} public: void solve(){ std::cout << "Core->solve" < 阅读全文
posted @ 2024-03-23 14:11 linxx- 阅读(10) 评论(0) 推荐(0) 编辑
摘要:存在业务玩法,在单个场景内大量使用定时事件用于触发数据更新。 skynet的定时器模块实现已经非常高效,一般不必太担心性能问题,事实上玩法的初版实现正是直接使用框架定时器处理触发。几个方面是期望做得更好的: 减少外部消息。框架的定时事件是通过消息机制通知到指定service的,而单位时间内能处理的外 阅读全文
posted @ 2024-03-23 14:09 linxx- 阅读(48) 评论(0) 推荐(0) 编辑
摘要:版本:mongoDB 4.2 集群方案:副本+分片 一个问题场景:集合内对多个字段建立索引,其中包含数组索引;当执行查询时,业务查询期望命中数组索引,mongodb筛选策略首次给出的执行方案命中了另外的索引key,导致当次慢查询,扫描超过1000w数量的文档,业务出现卡顿; 处理&优化方案: mon 阅读全文
posted @ 2024-03-23 14:05 linxx- 阅读(8) 评论(0) 推荐(0) 编辑
摘要:存在业务场景,对当前在线玩家发送消息通知。 这里将消息生产的服务称为source,目标玩家服务称为target。对单个玩家使用独立的lua虚拟机进行代理,称为agent,承载agent的节点称为user。 区分source和target是否存在于相同的skynet节点: 如果处于相同的节点,那么只是 阅读全文
posted @ 2024-03-23 14:01 linxx- 阅读(74) 评论(0) 推荐(0) 编辑
摘要:线上服务器的监控告警,我们暂且从三个层级上分析; 业务层:业务相关的日志告警机制。跟业务设计强相关,比如客户端的业务上行请求数据异常之类的告警,业务上定义日志级别(INFO/WARN/ERROR),输出到指定日志文件并通过业务层逻辑抛出,数据分析的埋点、业务行为相关的辅助日志都在这里实现; 一套日志 阅读全文
posted @ 2024-03-23 13:54 linxx- 阅读(13) 评论(0) 推荐(0) 编辑