跨服好友系统研究
前言
前段时间制作并实现了一个网络游戏的好友系统,记录一下解决思路,这个系统有几个前提条件:
好友数据属于玩家数据,只能在玩家在线时查询和修改,也就是玩家离线时不能操作。
玩家好友有数量限制。
玩家发送好友请求之后,另一个玩家同意则建立好友关系。
思考
由于好友数据属于玩家数据,所以维护好友关系的表应该设计成双向表,即两个玩家之间的好友关系,应该存在两条数据,分别属于这两个玩家,这个表称为 friendship
表;另外还有一表用来存放好友请求,用来记录一个玩家收到的好友请求,这个表称为 friend_request
表。
玩家发送或同意好友请求时,另一个玩家可能不在线,所以不能直接操作另外一个玩家的数据,为了解决这个问题,需要设计一个离线数据系统。
离线数据
离线数据是一种特殊的玩家数据,玩家离线时只能新增,玩家上线后按照时间顺序逐个处理后立即删除。
一旦有这种需要操作另一个玩家数据的需求时,如果玩家在线,则直接处理,如果不在线,则记录到离线数据表里,等待玩家上线时进行处理。
系统设计
所以玩家好友的处理,我拆分成了以下几个阶段:
发送请求:当玩家好友列表没有达到上限,并且对方还不是好友时,玩家可以向对方发送一条好友请求,其中包含了发送者id,发送时间,若对方在线,则直接记录到对方的friend_request
表;若不在线则记录到对方的离线数据里。
接受请求:玩家可以接受friend_request
表里的好友请求,前提是这个玩家好友列表没有达到上限,接受好友请求之后删除这条friend_request
,立即往自己friendship
表里添加一条记录,同时要往发送者friendship
表里添加记录,用离线数据方法处理。
拒绝请求:拒绝请求只需要删除friend_request
表中的记录就可以了,不需要额外操作。
删除好友:玩家可以删除friendship
表中建立的好友关系,同时需要删除对方friendship
表中的记录,同样用离线数据方法处理。
问题与解决方法
由于好友有数量限制,所以接受好友请求往对方friendship
表里添加记录时,对方的好友数量可能已经满了,处理方法是,对方的服务器进程判断如果好友数量满了,则按删除好友的逻辑进行处理。
总结
这是一个比较简易的跨服好友系统,基本能够满足需求,引入了离线数据去操作无法在玩家离线时处理的数据,一些网络游戏会把好友系统单独做成一个好友服务器,使游戏服务器以外的其他地方也能够调用。