http://blog.csdn.net/herm_lib/article/details/7477673
http://www.cppblog.com/jaxe/archive/2010/08/30/125258.html
游戏的cache server的设计和实现策略由游戏逻辑特点决定。RPG和SNS类用户(这里用户指游戏中的玩家帐号和角色)行为特征不一样,他们的cache server实现策略也存在不同。
RPG类的cache server实现起来比较简单一些。
大部分情况以玩家帐号和角色ID作为key,处理查增改删的功能。
查询
先看cache中有没有对应key的数据,有,直接返回;没有从持久化设备处查询,查到了,更新cache。
增加和更新
很多时候,这两个功能要一起实现。增加一条记录大部分情况要有返回值。
应用要增加一条记录,要确定一下,他是否存在了,存在的话,就更新一下cache。同时记录一下,这条记录已经改过的(一般称为"脏数据"),经过一定的时间后,会被同步到持久化设备中。
如果新增的记录确实不存在,往cache里增加一条记录,也把这条记录做个标记,过段时间将数据写到持久化设备中。
这里说一下针对不同数据采用不同写入持久化设备优先级的方法。我用的方法比较直接简单,启用多个队列,不同的队列代表不同的写入优先级。有更新的数据,将其放到某个优先级队列中,到了时间,这些改变的数据将会被写到持久化设备。
删除
先把cache中的数据拿掉,接着删除持久化设备的数据。
接下来说一下SNS类游戏的cache server实现策略
SNS类游戏和RPG不同地方:
(1) A会直接操作R,改变R的某些数据;有时候,B也会同时改变R的数据。
(2) 很多时候,游戏服务器上的R在某些数据被其他角色改变后,须要知道哪些数据被改变了,保证在一定的时间拿到新数据。
针对上面两点,cache server还要提供增量改变数据和提供改变通知的功能。
一种是,R数据变了,只要R在线就通知R。
另外一个种是,R告诉cache server要通知的数据,这样cahce server上的R的数据被改了,如果R在线,而且确定改的数据是要通知的数据,才要告诉R,哪些数据被改了。
根据上面的介绍,图方便的开发人员,可以看看有没有现成的第三方cache server可以直接用,比如memcache,redis之类能否满足业务要求。
总结一下,SNS类的cache server的功能是RPG类的cache server超级。能用到sns类的通用cache server也可以满足RPG类的游戏。
在游戏服务器中,处理玩家登陆需要向数据库查询玩家的账号和密码,玩家上线和下线需要对玩家的角色数据从数据库中读取和保存。可以说,相对于游戏逻辑处理来说,数据库操作是一种相对很慢的操作,即便你通过使用多个线程多个数据库连接来提高数据库操作的处理能力,但是,在高并发高负载的服务器应用中,这样仍然会是相当的负载瓶颈。设想这样一种设计方案,见下图:
在大量玩家登陆游戏服务器时,由于有大量的数据库访问请求,即便是有自己实现的CACHE机制,还是会导致服务器耗尽所有的逻辑线程资源,服务器的处理能力将降低成DBMS的处理能力。
为了不阻塞逻辑线程,可以采用异步数据库访问的方式,即数据库操作请求提交给专门的数据库处理线程池,然后逻辑线程不再等待数据库处理结果,继续处理其他,不再阻塞在这里。
抽象的来看,对于一个需要持久化的游戏对象来说,可以考虑它有2个方法,读取和保存。那么我们抽象一个DBO接口:
struct IDbo
{
virtual bool SaveToDB(DB*)=0;
virtual bool LoadFromDB(DB*)=0;
};
然后把设计方案改成下面这种:
改成数据库异步处理后,在想想现在的游戏数据的保存机制应该是怎样改进的,为了保障数据安全,我们希望不只是玩家下线的时候才会保存玩家数据,而是希望每隔一段时间统一保存所有在线玩家的数据,那么,可以考虑这样的思路:假设我们有一个GAMEDB服务器,GAMEDB缓存了所有在线玩家的角色数据,每到保存时间,GAMEDB就将所有在线玩家的数据(DBO)的副本都统一提交给DB线程池,让它保存数据,提交的过程很快,提交完后,GAMEDB的逻辑线程仍能继续处理游戏服务器的更新和读取CACHE的请求。为什么要保存副本呢,DB线程的执行保存队列的过程也许很耗时,但是队列中的数据都是GAMEDB提交DBO那个时刻的数据,这样就能保证玩家的游戏数据的完整性。
当然,我这里提的这只是个思路,这里面还有很多细节没有讨论,例如如果DB线程池正在保存九点钟时刻保存的数据,到了十点钟新的保存时刻时,DB线程池还没保存完九点钟时刻的DBO副本队列,这时应该怎么处理;DBO对象的划分粒度的问题;DBO队列的优先级的问题等等。
分享到:
相关推荐
设计这类服务的数据结构时,需要考虑到职位类别、工作类型、薪水分类、公司信息等多个维度,以满足用户在招聘和求职过程中的需求。 10. 系统数据安全性和隐私保护: 在设计SNS平台的数据结构时,还需要特别注意系统...
社交(SNS)网站设计是一个复杂的过程,涉及到用户体验、功能规划、社区建设以及用户增长策略等多个方面。以下将根据提供的内容,详细阐述SNS网站设计的关键点。 首先,SNS网站的特点在于其用户基础庞大,主要由年轻...
《SNS网站系统的设计与实现》是一份综合性的毕业设计,涵盖了从理论到实践的全过程,旨在构建一个社交网络服务(Social Networking Service)平台。该设计不仅包括了系统的架构设计,还提供了完整的源代码、论文、...
标签"数据库 sns 设计"直接反映了文档内容的聚焦点,即数据库设计在sns类网站中的应用。 从部分内容来看,文档中详细列出了社交网络数据库设计可能包含的各个部分: 1. 引言部分阐述了编写文档的目的是为了让需求...
### SNS社交网络社区网站设计的关键知识点 #### 一、SNS社交网络社区设计的核心要素 SNS(Social Networking Service)社交网络服务是指帮助人们建立社会性网络的在线平台。设计一个成功的SNS社交网络社区,需要从...
SNS2124&SNS2224&SNS2248&SNS3096&SNS5192&SNS5384产品文档
### 大型SNS网站数据库设计精要 在构建大型社交网络服务(SNS)时,数据库设计是至关重要的环节,直接影响着系统的可扩展性、性能和成本效益。本文将深入探讨大型SNS网站数据库设计的关键要素,包括数据库选型、...
在当前的互联网时代,社交网络服务(SNS)已经成为人们日常生活和娱乐的重要组成部分,而游戏行业则在SNS平台的推动下,找到了新的发展路径。本文将深入探讨SNS环境下的游戏行业发展趋势及其面临的挑战。 首先,SNS...
社交(SNS)网站的完整设计思路
关于SNS游戏服务器、程序设计相关的架构设计,代码设计
【sns社交类网站源码】 SNS(Social Networking Services)社交网络服务是一种在线平台,让人们可以建立和维护联系,并分享各种形式的信息和活动。这款国外SNS社交网站源码是构建此类平台的基础,它提供了完整的...
SNS社交网站数据库设计 数据库设计是社交网站的核心组件之一,良好的数据库设计可以提高网站的性能、可扩展性和可维护性。本文将对SNS社交网站数据库设计进行归纳和总结,涵盖用户表、好友关系表、消息表、活动表、...
为了解决这一问题,黄月胜、王泓为、郭海涛三位学者提出了基于SNS(Social Networking Service,社交网络服务)技术的分布式网络协作学习系统设计方案。 首先,我们需要了解SNS技术在系统设计中的作用。SNS技术的...
### SNS化的图书馆虚拟和现实的融合——浅析高校图书馆的“以人为本”的实施方案 #### 一、SNS概述 ##### 1.1 SNS概念 社会性网络服务(Social Networking Service,简称SNS)指的是建立在人际关系基础上的一种...
【描述】:“社交类网站发展与问题之我见.ppt”这篇博文深入分析了SNS自诞生以来的发展轨迹,从早期的MySpace、Friendster到现在的Facebook、微博、微信等全球性的社交巨头,这些平台如何改变了人们的沟通方式。...
这款源代码为开发者提供了构建自己的社区论坛系统的强大工具,有助于理解SNS网站的设计理念和实现技术。 一、C# MVC框架介绍 C# MVC(Model-View-Controller)是微软推出的一种用于构建可维护性高、测试性强的Web...
SNS(Social Networking Service)框架是为了简化社交网络应用开发而设计的,它通常包括用户管理、好友关系、动态发布、消息通知等功能。Focus SNS 框架可能提供了这些基础功能的抽象和实现,开发者可以在此基础上...