skynet伪并发

一、背景 和 erlang 不同,一个 skynet 服务在某个业务流程被挂起后,即使回应消息尚未收到,它还是可以处理其他的消息的。所以同一个 skynet 服务可以同时拥有多条业务执行线。所以,你尽可以让同一个 skynet 服务处理很多消息,它们会看起来并行,和真正分拆到不同的服务中处理的区别是,这些处理流程永远不会真正的并行,它们……

阅读全文

skynet火焰图

一、背景 前面腾讯云mongo服务采坑和优化Mongo降CPU两篇文章从两个角度记录了我们解决水晶活动异常所用到的方式。但这些都是外部的,真正是否机器不够用、数据库拖慢服务还是其它问题还是得从代码层面入手。从数据库入库记录和请求日志已经很清晰就是水晶抽卡导致负载上升服务异常的,所以……

阅读全文

优化Mongo降CPU

一、背景 前面腾讯云mongo服务采坑中提到每次水晶活动才开始的时候会吸引大量玩家来抽卡,会导致cpu居高。当然就算没有水晶活动每日凌晨跨天游戏玩法重置等入库外加新的一天较多玩家同时进入也会导致cpu比平时多挺多,如图所示。 二、降CPU 加机器 避免单实例cpu太高的方法也可以通过加机……

阅读全文

腾讯云mongo服务采坑

一、背景 我们项目存储游戏数据采用的mongo服务,流水等记录数据存储采用的mysql服务。之前是部署到每台业务机器上,开在线上机器的游戏服一般直接连接本机mongo服务。最新的项目由于业务增长运营方要求将我们使用的mongo服务和mysql服务迁移到腾讯的云服务上面去,保障”数据……

阅读全文

后端服务动态转发

一、背景 当前我们游戏架构通过水平扩展wgame节点(和区服无关只处理玩家连接和玩家服务数据)来承载在线玩家的。通过一直扩展减轻单个wgame节点负载和承载更多在线玩家。 在wgame节点前面增加一层nginx以实现wss(客户端和服务端通过websocket连接,但是微信等小程序要……

阅读全文

etcd lualib for skynet

一、背景 以前项目配置都是放在skynet的启动配置里面,当线上项目进程节点变多后需要加新配置内容的时候需要全部重新生成启动配置,不统一的配置内容(mongo数据库地址、mysql数据库地址、进程节点ip和进程监听端口等)会导致配置管理变得非常麻烦,而且不能比较方便实时更改配置。为……

阅读全文

一条SQL查询语句是如何执行的 MySQL学习笔记 一

大体来说MySQL可以分为Server层和存储引擎层两部分。 Server层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖MySQL的大多数核心服务功能,以及所有的内置函数(日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。 存储……

阅读全文

Redis String

一、数据结构基础 sds在C字符数组的基础上增加了长度和空间元数据,使基于字符串长度的追加、复制、比较等操作可以直接读取元数据,提升效率。。 SDS总共设计了五种类型,分别为sdshdr5、sdshdr8、sdshdr16、sdshdr32和sdshdr64。他们的主要区别是数据结构……

阅读全文

Redis Hash

Redis中的dict数据结构采用链式哈希方式存储。负载因子大于等于1时触发哈希扩容检测,当存在RDB子进程或者AOF子进程时关闭哈希扩容(避免父进程大量写时复制),不过即使没开启hash扩容在负载因子大于dict_force_resize_ratio时也会执行哈希扩容,扩容大小……

阅读全文

Redis核心技术与实战 学习笔记 一

Redis的特性是“快”。一方面是因为它是内存数据库,所有操作都在内存上完成,内存的访问速度本身就很快。另一方面归功于它的数据结构。键值对是按一定的数据结构来组织的,操作键值对最终就是对数据结构进行增删改查操作,所以高效的数据结构是Redis快速处理的基础。

……

阅读全文