游戏开发论坛

 找回密码
 立即注册
搜索
查看: 8939|回复: 1

MMO-SNS类游戏服务器间数据交互策略分享

[复制链接]

1万

主题

1万

帖子

2万

积分

管理员

中级会员

Rank: 9Rank: 9Rank: 9

积分
20515
发表于 2012-3-18 00:30:00 | 显示全部楼层 |阅读模式
作者:herm_lib
博客:O1高地


  MMO-SNS类游戏是一种在线角色之间存在交互,同时在线角色又可以同离线角色交互的游戏。这两种交互行为,决定了不同服务器之间的数据交互和常见的MMO类游戏存在很大差别。这类型一般会有下面两种类型的主服务器。

  OnlineSvr实现一些MMO的业务逻辑,实现像做任务、战斗、NPC AI、视野管理和消息同步等行为。

  OfflineSvr 实现一些离线类的SNS业务逻辑。注意,这个服务器涉及到操作离线角色的一些数据。

  OnlineSvr和OfflineSvr的数据交互有一点讲究。简单以角色的EXP做为交互例子。有一个角色R,在OnlineSvr1上,他的经验值记为EXP;有另外一个角色,是R的好友,记为RF吧,在OnlineSvr2上。这个例子我只考虑R的EXP变化。

 
交互策略一



流程:

  1. R登录后,从OfflineSvr获取EXP1。

  2. R执行某个行为后,获取了一些EXP,总的EXP就变成了EXP2,OnlineSvr1把EXP2同步到OfflineSvr。

  3. 以此同时,OnlineSvr2上的RF获取了OfflineSvr的R的经验值EXP1。接着RF执行对R的某种SNS行为(比如挑战,挑战过程R不知道),R也可以获取一些经验,R的总经验变成了EXP3,最后OnlineSvr2也会把EXP3同步到OfflineSvr。

  注意上面两个步骤是同时进行的,而且谁先同步都不确定。

  4. OfflineSvr收到EXP2和EXP3,最终EXP变成EXP2或EXP3都是不对的,有一部分的EXP丢失了。

  从上面流程描述可以看出,直接用总量数据进行服务器间数据同步,业务并行时,同步会出错。


交互策略二



  1. R登录后,从OfflineSvr获取EXP1。

  2. R执行某个行为后,获取了一些EXP,总的EXP就变成了EXP2,OnlineSvr1把增加的EXP,就是增量DeltaExp传给到OfflineSvr。

  3. 以此同时,OnlineSvr2上的RF获取了OfflineSvr的R的经验值EXP1。接着RF执行对R的某种SNS行为,R也可以获取一些经验,OnlineSvr2也将增加的EXP DeltaEXP3传给OfflineSvr。

  4. OfflineSvr收到DeltaEXP2和DeltaEXP3,最终将DeltaEXP2和DeltaEXP3家到EXP1上。

  5. OfflineSvr传DeltaEXP3给OnlineSvr1;或者,OnlineSvr1主动获取DeltaEXP3。OnlineSvr1上的EXP1和OfflineSvr保持一致。


交互策略三
                 


  交互策略二存在点问题,DeltaEXP如果丢失了,OnlineSvr和OfflineSvr的EXP1将会不一致。对策略二的处理方法做点改进。

  1. R登录后,从OfflineSvr获取EXP1。

  2. R执行某个行为后,获取了一些EXP,总的EXP就变成了EXP2,OnlineSvr1把EXP2同步到OfflineSvr。

  3. 以此同时,OnlineSvr2上的RF获取了OfflineSvr的R的经验值EXP1。接着RF执行对R的某种SNS行为, R也可以获取一些经验,OnlineSvr2将增加的EXP DeltaEXP3传给OfflineSvr。

  4. OfflineSvr收到EXP2和DeltaEXP3,最终将EXP1替换成 EXP2,并且把DeltaEXP3保存起来。

  5. OnlineSvr1主动获取DeltaEXP3,将DeltaEXP3加到EXP2,又将结果同步到OfflineSvr。


其他问题

这类服务器数据交互,可以归纳为下面三个要素:

1. 基准数据服务器

  相同的数据有多份副本在不同服务器上,应用要确定以哪个服务器上为准。基准服务器的确定,是由业务特点决定的,一般哪个服务器数据改变频率最高,就可以以该服务器上的数据为基准数据。这样可以减少服务器间的数据同步或通知的频率,减少流量,减少数据不一致的时间长度。

2. 全量数据同步和增量数据通知

  上面的EXP1,2,3就是全量数据,DeltaEXP3就是增量数据。同步全量数据到另外一个服务器,还是通知增量数据,由哪一方是基准数据服务器决定。

3. 服务器对增量数据实时性要求

  处理OnlineSvr和OfflineSvr中的数据实时性方法不一样。

  OnlineSvr需要及时获取变化数据方法

  当位于OnlineSvr2上的其他角色让EXP(EXP是OnlineSvr1上一个角色的EXP)发生变化时,记EXP变化量为DeltaEXP ,OnlineSvr1不能及时知道。 下面是一种比较安全的处理过程:

  ① OnlineSvr2通知DeltaEXP到OfflineSvr,OfflineSvr保存DeltaEXP。

  ② OfflineSvr向OnlineSvr1发一个通知,某个角色EXP发生变化了。

  ③ OnlineSvr1从OfflineSvr取DeltaEXP。

  ④ DeltaEXP被取走后,OfflineSvr将DeltaEXP清0。

58

主题

1437

帖子

2207

积分

金牌会员

Rank: 6Rank: 6

积分
2207
发表于 2012-3-18 05:32:00 | 显示全部楼层

Re:MMO-SNS类游戏服务器间数据交互策略分享

把绝对值,变成相对值,每次增加或减少同步到服务器,服务器加减后返回值。
返回值=增加值+(可能插入行为)+基础值+(可能的插入行为)
因为加号顺序可以任意调换,返回值虽然不是实时,数据却是正确。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-9 16:19

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表