SLG的高竞争业务中避免使用锁的槽位锁设计方式

一、设计初衷

SLG游戏中服务器常态需要运行数千玩家的定时数据,玩家在线高峰时,发送的请求数量也比较多,玩家之间交互较多,会有大量的行为涉及到修改他人的数据,例如,玩家战胜别人会掠夺别人资源.这里就涉及到一个并发问题以及数据共享问题.这里需要保证两个要求.
1.高并发
2.数据竞争
高并发的问题,可以采用开启多个协程来提高并发性能,压榨多核CPU性能
数据竞争的问题,有两种解决方式:
1)数据加锁
2)需要共享操作的数据放在同一个协程中顺序执行
在通常的考虑中,一般尽量避免给数据加锁,加锁比较沉重,并且很容易造成难以解决的问题,并且加锁的数据比较大,使用频繁,会降低性能。
结合解决方式2,经过槽位锁设计可以避免加锁带来的性能问题并且可以充分利用golang多核编程来压榨CPU的性能。

二、设计思路

开启40个玩家协程,为每个角色分配一个唯一的协程来处理他的操作,那么采用角色ID对协程数量取模的方式,可以获得一个唯一处理该角色的协程,那么,解决了单协程处理所有玩家操作的性能瓶颈问题,提升了并发能力,并且保证了玩家自己的操作不会被多个协程同时处理,保证了处理的有序性。
接下来解决一个玩家的数据会改变另一个玩家数据的问题
如编号为39的玩家需要改动编号为40的玩家的数据,两个玩家分别由两个协程处理,某一个时刻,玩家39打赢了玩家40,需要从玩家40身上掠夺1000粮草,而玩家40此时正在使用粮草进行征兵,由于是2个协程进行处理,对玩家40的数据产生了数据竞争,就有可能发生问题。

解决办法:
将会产生数据竞争的玩家数据,提取出来交给一个唯一的协程A处理,玩家39协程和玩家40协程都向协程A发送数据变更消息(通过信道),并且等待处理结果,那么协程A就会按照进入信道的消息顺序来处理2个操作,保证竞争的数据变成了有序的处理方式,再将处理结果返回到协程39和协程40让这两个协程继续执行。以此来解决数据竞争问题。
为了提高数据处理能力,开启和玩家协程数量一致的数据处理协程,那么玩家39的存在竞争的数据就会被固定分配在39号数据处理协程上,处理性能会得到很大提升

三、数据比对

经过测试,处理器为16核,1万玩家数据进行共计进行100万次金币改变,加锁方式的平均处理时间200ms,1协程处理时1300ms,8协程处理时850ms,16协程处理约为160ms,32协程处理约为130ms.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值