跨服好友系统研究

前言

前段时间制作并实现了一个网络游戏的好友系统,记录一下解决思路,这个系统有几个前提条件:

  • 好友数据属于玩家数据,只能在玩家在线时查询和修改,也就是玩家离线时不能操作。

  • 玩家好友有数量限制。

  • 玩家发送好友请求之后,另一个玩家同意则建立好友关系。

思考

由于好友数据属于玩家数据,所以维护好友关系的表应该设计成双向表,即两个玩家之间的好友关系,应该存在两条数据,分别属于这两个玩家,这个表称为 friendship表;另外还有一表用来存放好友请求,用来记录一个玩家收到的好友请求,这个表称为 friend_request表。

玩家发送或同意好友请求时,另一个玩家可能不在线,所以不能直接操作另外一个玩家的数据,为了解决这个问题,需要设计一个离线数据系统。

离线数据

离线数据是一种特殊的玩家数据,玩家离线时只能新增,玩家上线后按照时间顺序逐个处理后立即删除。

一旦有这种需要操作另一个玩家数据的需求时,如果玩家在线,则直接处理,如果不在线,则记录到离线数据表里,等待玩家上线时进行处理。

系统设计

所以玩家好友的处理,我拆分成了以下几个阶段:

发送请求:当玩家好友列表没有达到上限,并且对方还不是好友时,玩家可以向对方发送一条好友请求,其中包含了发送者id,发送时间,若对方在线,则直接记录到对方的friend_request表;若不在线则记录到对方的离线数据里。

接受请求:玩家可以接受friend_request表里的好友请求,前提是这个玩家好友列表没有达到上限,接受好友请求之后删除这条friend_request,立即往自己friendship表里添加一条记录,同时要往发送者friendship表里添加记录,用离线数据方法处理。

拒绝请求:拒绝请求只需要删除friend_request表中的记录就可以了,不需要额外操作。

删除好友:玩家可以删除friendship表中建立的好友关系,同时需要删除对方friendship表中的记录,同样用离线数据方法处理。

问题与解决方法

由于好友有数量限制,所以接受好友请求往对方friendship表里添加记录时,对方的好友数量可能已经满了,处理方法是,对方的服务器进程判断如果好友数量满了,则按删除好友的逻辑进行处理。

总结

这是一个比较简易的跨服好友系统,基本能够满足需求,引入了离线数据去操作无法在玩家离线时处理的数据,一些网络游戏会把好友系统单独做成一个好友服务器,使游戏服务器以外的其他地方也能够调用。