我们都知道MMO游戏的流行趋势。球员们面对面生活。
我关注的领域是玩家移动和游戏结果的存储。
通过NPGSQL适配器使用Csharp和PostgreSql v9.0
游戏客户端是基于浏览器的ASP.NET,并为所有与数据库相关的处理调用Csharp函数
要了解我的查询,请考虑以下方案
我们将游戏进度存储在postgres表中。
例如锦标赛从四名玩家开始并跟随活动
以上两轮现在将在游戏进度表中,如
ROW Player1HP Player2HP Strikefrom StrikeTo ReturnStrikeHP Round TimeStamp StrikeMethod
1 100 100 0 0 0 0
2 98 92 P1 P2 2 1
要查看锦标赛是否结束,我们会检查3名玩家的生命值是否为零或游戏时间已超过上次进度的规定超时值
我们的桌子有一个主要游戏,名为随机32个字符代码,基于玩家(每个玩家8个)
还有其他一些专栏,例如护甲,法力,法术,每个玩家都可以继续使用,总共有48列 - 每个玩家12个属性及其属性
最后有一个gameResult表,它有锦标赛的结果,包括tournamentid,tournament_timestamp,gameresult(完成,PlayerSurrender,InvalidSession,SecurityHack,TimeOut),winnerPlayer,playerMetrics,rowIDfrom,rowIDto
QUERY
我的问题主要集中在降低游戏数据库或Sql的负载上 查询
a)如何检测玩家是否未同时登录并打开两个游戏会话但无需引用数据库或使用Sql
b)如何控制GameProgress表中的记录激增。这样玩家就能更快地得到回应。服务器在高峰时段或1000名玩家在线时开始滞后
There is a tremendous flow of sql queries, for ex. even in the current game version
There are average/minimum 100 tournaments online per 12 minutes or 500 players / hour
In Game Progress table, We are storing each player move
a 12 round tourament of 4 player there can be 48 records
plus around same number for spells or special items
a total of 96 per tourament or 48000 record inserts per hour (500 players/hour)
我也在考虑在Csharp中使用后台进程,它将过期的锦标赛记录从GameProgresstable移动到另一个数据库,我们的服务器没有游戏负载。
c)我们应该多久使用一次充满postgres的真空。
我对新应用程序opensource或toPay持开放态度,这可以提高性能。对于前者我们使用FastCsvReader http://www.codeproject.com/Articles/9258/A-Fast-CSV-Reader来改进服务器日志文件的枚举。
问候 Arvind的
答案 0 :(得分:2)
How to detect if a player has not logged in simutaneously and opened two game sessions
but without having to refer to a Database or using Sql
假设您使用多个服务器,您可以在某个地方创建仅注册登录和注销的进程。只要其中一个发生,你就会调用它。您可以使用该过程来检查用户是否已经登录。您可以通过在所有服务器上运行该过程并使用算法仅为一部分用户使用serverx来对此过程进行负载均衡。假设您有10台服务器,请执行(userId%10)以获取用户注册登录/注销的服务器的ID。
这样,您只能在内存中通过服务器之间的调用进行这些检查。可能您需要超时/刷新调用,因此断开连接的用户或崩溃的服务器将不会让用户永远登录。
How to control the surge of records into the GameProgress table. so that players get
response quicker. The Server starts to lag at peak hours or when 1000 players are
online
#1将postgress数据库切换为使用SSD进行存储
#2将整个过程提升到内存中,不要将数据库用于实时工作
#3更新数据库中的记录而不是创建新记录
#4使用多个数据库并在其上分发用户
#5 ....
Our table has a primarykey as tournamentid a random 32 character code on basis of
playerids.
随机生成的主键是非常糟糕的做法imho。使用序列,或保证任何东西都是唯一的。如果你的随机码不够随意,你会得到非常讨厌的错误。你需要每场比赛只生成一次,所以它不是性能瓶颈。
答案 1 :(得分:1)
我建议的另一件事虽然它有复杂性成本,但考虑将经常更新的系统部分移动到类似VoltDB的部分。这会带来复杂性成本,您可能希望使用他们的商业许可/支持。但是,如果您还有灾难恢复,那么主内存数据库在这种负载上的好处可能是值得的。然后,您的PostgreSQL实例可以处理更长期的数据,而VoltDB可以处理实时处理。