摘要:
问题场景是:服务A生产大量请求消息call到服务B,服务B瞬间达到消费能力的瓶颈,导致服务A堆积大量的yield状态协程,服务B消息队列堆积大量待处理消息,业务上出现卡顿、超时甚至物理机器内存吃满被瞬间击穿的问题; 我们使用云服务器产品部署游戏业务,起因是游戏线上收到反馈在某些时间节点频繁出现卡顿延 阅读全文
摘要:
当一个执行流程存在对外调用时,我们讨论如何保证流程的可用和安全; 假设流程是关键且强制原子性; -- serviceA function main() step1() skynet.call(serviceB, "lua", "step2") step3() return true end -- s 阅读全文
摘要:
这里只讨论单一进程内的只读数据共享。 同一进程内虚拟内存空间是原本就共享的(以C为例),但在业务开发上,一般会嵌入脚本语言,使用VM的沙盒环境独立维护不同的上下文(以lua为例),多个VM之间(暂时称为业务VM)的数据相互独立。 业务上涉及数据共享的,一般的场景是优化性能、资源占用的情况。需要共享的 阅读全文
摘要:
我们会有需要自定义加载模块逻辑的需求,比如支持从自定义格式数据包中加载一个被加密过的lua文件的方式,这在生产环境中非常常见,可以有效保护源码同时保持整洁; lua模块管理库会从若干个loader中逐个尝试加载模块,lua原生提供了4个loader; static const lua_CFuncti 阅读全文
摘要:
场景是多个c扩展库(for lua)之间需要共享运行时的状态数据,期望是不使用lua逻辑介入; 记录一个方案:通过lua全局注册表 C扩展库中一些数据通过全局注册表放入lua状态机。最方便且能保证唯一性的 key 是一个 light userdata。使用一个static 变量的地址作为 key 在 阅读全文
摘要:
c+lua开发中常见的实现:c库实现功能,供lua调用; 比如排行榜模块(跳表),实现方案可为:c库实现跳表(skip list)核心逻辑,提供接口供lua层中操作使用; 那么c库显然有以下的实现(伪码,演示用): // skip list core struct skiplist { // ... 阅读全文
摘要:
讨论C++语言中如何将通用逻辑与使用到的频繁变化的具体类型解耦。 假设存在以下设计: /* */ #include <iostream> class Core { public: ~Core(){} public: void solve(){ std::cout << "Core->solve" < 阅读全文
摘要:
存在业务玩法,在单个场景内大量使用定时事件用于触发数据更新。 skynet的定时器模块实现已经非常高效,一般不必太担心性能问题,事实上玩法的初版实现正是直接使用框架定时器处理触发。几个方面是期望做得更好的: 减少外部消息。框架的定时事件是通过消息机制通知到指定service的,而单位时间内能处理的外 阅读全文
摘要:
版本:mongoDB 4.2 集群方案:副本+分片 一个问题场景:集合内对多个字段建立索引,其中包含数组索引;当执行查询时,业务查询期望命中数组索引,mongodb筛选策略首次给出的执行方案命中了另外的索引key,导致当次慢查询,扫描超过1000w数量的文档,业务出现卡顿; 处理&优化方案: mon 阅读全文
摘要:
存在业务场景,对当前在线玩家发送消息通知。 这里将消息生产的服务称为source,目标玩家服务称为target。对单个玩家使用独立的lua虚拟机进行代理,称为agent,承载agent的节点称为user。 区分source和target是否存在于相同的skynet节点: 如果处于相同的节点,那么只是 阅读全文