基于Gossip的online server
在游戏服务端架构中online server,有些也叫center server。
主要承载以下功能:
- 存储玩家的在线信息,处理上线和下线消息。
- 转发消息给特定玩家。
online server在架构图中的位置
online server集群内部架构图,以3个实例为例:
特点:
- svr之间相互连接,采用Gossip协议通信。
- 各svr的数据是全量的,采用最终一致性。
数据结构:
存储玩家在线信息:hashmap,uid--gateid
转发消息:uids,visited_svrid,msg
消息处理过程:
第一类:上下线消息
逻辑:任意一个svr收到消息后,给与之相连的svr转发消息
要点:收到上线消息时,可能当前svr存在之前的在线信息,需要给之前的gateid推送下线信息。
第二类:转发消息
逻辑:任意一个online svr收到消息后,判断需要转发的uid是否在当前svr上:能匹配到的直接转发,匹配不到的,重组消息(携带未匹配的uid、拼接上当前的svr id、需转发的消息内容),挑选任意一个没有遍历过的svr再次转发。重复下去,直到uid全部都匹配成功或者所有的svr已遍历一遍。
要点:由于各svr满足最终一致性,理论上来说大部分消息转发一次就可以了。
周边逻辑:
- 添加online svr监控:各svr的转发消息接收数和转发数,观察online svr的承载力。
- 添加online svr监控:各svr的在线用户数,观察负载均衡的效果。
- online svr重启时,不需要从其他svr复制数据。
- 有些场景下,online svr的数据需要持久化。可以定时周期性的备份数据到本地文件。
- 其他svr转发消息时,需要规避不存在的uid,避免拖慢online svr的性能。
- online svr集群中实例数配置为3个,可以满足大部分场景。
实质:
这里使用的Gossip模型,实际上是nodes=3、fanout=2、interval=0。
具体场景时,可以进行调整。
特点:
- 扩展性
- 容错
- 去中心化
- 一致性收敛
- 简单
refer:
一文了解啥是Gossip协议?
https://www.jianshu.com/p/37231c0455a9
Gossip 协议详解
https://zhuanlan.zhihu.com/p/162970961
Gossip协议动画