网游服务器
herm_lib
一南游戏
腾讯IEG
展开
-
kqueue&epoll控制事件的注意点
kqueue&epoll都有READ, WRITE,ERROR事件等。在使用两者的过程中,发现kqueue对事件的控制很合理,而epoll有的地方要认真看文档加实践才能知道是怎么回事。1. 激活(Enable)1个事件 epoll通过EPOLL_CTL_MOD激活某个事件,这里有个注意点,epoll里本来有一个READ事件,MOD时只传WRITE事件,这个是时候,epoll里只有WRITE事件,READ事件没有了。 kqueue通过EV_ENABLE就能让某个事件激活,而不影响已注册的事件。原创 2010-11-12 21:07:00 · 1888 阅读 · 0 评论 -
RPG和SNS类游戏的cache server设计和实现区别随笔
把平时对cache这块内容的思考、实践总结一下。游戏的cache server的设计和实现策略由游戏逻辑特点决定。RPG和SNS类用户(这里用户指游戏中的玩家帐号和角色)行为特征不一样,他们的cache server实现策略也存在不同。RPG类的cache server实现起来比较简单一些。大部分情况以玩家帐号和角色ID作为key,处理查增改删的功能。查询原创 2012-04-19 15:09:16 · 2639 阅读 · 3 评论 -
遇到的一个bug
大体代码是这样:class Role;void GameMgr::Handle(){ DispParam dp; Role* role = GetRole(xxx); if (!role) { role = CreateRole(...); dp.rol原创 2012-05-31 19:47:43 · 941 阅读 · 0 评论 -
从 Memcached 分布式应用看一致性哈希散列函数的选择 .
转自 http://blog.csdn.net/shagoo/article/details/5974643 一致性哈希算法来源于 P2P 网络的路由算法,目前主流的 P2P 软件就是利用我们所熟知的 DHT (Distributed Hash Table,分布式哈希表) 来定位整个分布式网络的信息,另外此算法在目前火热的云计算领域也将占有极其重要的位置。可以说散列函数在当代计算机和网转载 2012-07-09 15:37:18 · 1358 阅读 · 0 评论 -
protobuf用Extensions定义消息方法
protobuf Extensions这个东西还真蛮有用的, 这里记录一下用Extensions定义方法。msg.protopackage ProtoCS;enum CmdID{ CID_MOD = 1,}message MsgHead{ optional int32 cid = 1;}message Msg{ optional MsgHead原创 2012-08-08 15:20:59 · 16556 阅读 · 0 评论 -
修改一行代码的顺序引发恶心bug
起因原来的代码 m_recvBuffer->Clear(); m_multiplexor->Register(this, Herm::READ_MASK);Session初始化的时候,先把接收buffer清空,再注册读事件。几周前,加了一个小功能, 抽了一个小函数,最后代码顺序变化了一下 m_multiplexor->Register(this,原创 2012-10-24 18:18:01 · 1139 阅读 · 0 评论 -
使用epoll 在 linux 上开发高性能应用服务器
转载请注明: http://blog.csdn.net/herm_lib/article/details/8192371 O1高地概述epoll是linux提供一种多路复用的技术,类似各个平台都支持的select,只是epoll在内核的实现做了更多地优化,可以支持比select更多的文件描述符,当然也支持 socket这种网络的文件描述符。linux上的大并发的接入服务器,目前原创 2012-11-16 21:27:35 · 4645 阅读 · 1 评论 -
意见征集 游戏服务器实践之路
大家好。我是一个热爱技术的人,从事商业的服务器开发9年多,参与和负责了几款不同类型的游戏开发,包括SNS、ACG和RPG;也负责过IM的开发。运气比较好,属于实战型的程序员。我想写一个游戏服务器的序列文章,主要是自己实践的总结。发帖目的是想大家给点意见,怎么写,对须要经验分享的人有效果。我将在业余时间慢慢写,慢慢地写,争取每一部分都对读者有益。首先说一下我的写作原则:1 实践干货原创 2012-12-21 10:51:48 · 3316 阅读 · 22 评论 -
全区全服PVP服务器管理策略
转载请注明:http://blog.csdn.net/herm_lib/article/details/8654396首先我们要确定的是,能做全区全服的前提是,游戏不能有公共空间,就那种任何人都可以随便进出,然后有视野的空间,像MMORPG新手村,主城之类的;而副本、战场是带有私有性的局部空间,你的角色进出是有条件的。这两个的区别很关键。下面来看一下全区全服带有PVP服务器的一原创 2013-03-09 20:22:55 · 2988 阅读 · 0 评论 -
记录:protobuf在网游中的用法(二)
在上一篇介绍的protobuf用法(http://blog.csdn.net/herm_lib/article/details/7384613),有点偏复杂了。可以简化一下。结构: total_len[16] + head_len[8] + head + body。这次像上一篇介绍最后介绍的一样,把head和body分开了,这样可以让服务器对消息的处理更灵活,有时候,服务器只要head内容原创 2012-03-25 15:44:43 · 2516 阅读 · 0 评论 -
记录:protobuf在网游中的用法
消息传递过程:client ---> gated ---> zonedCS消息结构:message Head{ uint32 cmd_id;}message Body{ AuthReq auth_req;}message CSMessage{ Head head; Body body;}原创 2012-03-22 20:24:19 · 2424 阅读 · 0 评论 -
使用 kqueue 在 FreeBSD 上开发高性能应用服务器
本文出处:http://www.ibm.com/developerworks/cn/aix/library/1105_huangrg_kqueue/概述kqueue 是 FreeBSD 上的一种的多路复用机制。它是针对传统的 select/poll 处理大量的文件描述符性能较低效而开发出来的。注册一批描述符到 kqueue 以后,当其中的描述符状态发生变化时,kqueue 将一次性通知应用程序哪些描述符可读、可写或出错了。kqueue 支持多种类型的文件描述符,包括 socket、信号、定时器、AI转载 2010-12-01 10:13:00 · 3986 阅读 · 1 评论 -
服务器实现心跳机制的两种策略
<br />大部分CS的应用需要心跳机制。心跳机制一般在Server和Client都要实现,两者实现原理基本一样。Client不关心性能,怎么做都行。<br />如果应用是基于TCP的,可以简单地通过SO_KEEPALIVE实现心跳。TCP在设置的KeepAlive定时器到达时向对端发一个检测TCP segment,如果没收到ACK或RST,尝试几次后,就认为对端已经不存在,最后通知应用程序。这里有个缺点是,Server主动发出检测包,对性能有点影响。<br /> <br />应用自己实现<br />原创 2010-12-04 10:48:00 · 13205 阅读 · 2 评论 -
在一个IP:Port建立多个连接和启动监听
1. Socket Handle和地址对 一个socket handle对应srcIP:srcPort&destIP:destPort 在同一个地址上建立多个连接,像下面的实例: ip1:port1 --> ip5:port5 ip1:port1 --> ip6:port6 接着在这个地址上创建监听socket, ip1:port1 --> *:* 对应所有的ip&port。2. Herm的实现代码 在同一个地址上创建多个socket handles,关键在于原创 2010-12-13 17:07:00 · 2760 阅读 · 0 评论 -
TCP/UDP 常见的错误码
在实际TCP&UDP C/S数据收发过程中,常见error code有ECONNABORTED(WSAECONNABORTED),ECONNRESET(WSAECONNRESET),nonblocking io当然还有WOULDBLOCK(WSAWOULDBLOCK)。1. ECONNABORTED(WSAECONNABORTED) 这个tcp send引起的,一般是protocol stack重传超时或者protocol处理错误等。2. ECONNRESET(WSAECONNRESET)原创 2011-01-11 17:24:00 · 6069 阅读 · 0 评论 -
记录:几类协议的区分
<br />REQ(REQuire): 请求类协议,一般是client主动发起。<br />RES(RESponse): 回应类协议,对REQ的一个回应,带有处理结果的数据包。<br />ACK(ACKnowledge): 确认类协议,对REQ的一个回应,与上面的区别是数据包中只有确认序号之类的东西,没有其他内容。<br />NTS(NoTiCE): 通知类协议,这类协议,接收者无须回应(RES或ACK)。原创 2011-05-25 11:10:00 · 1243 阅读 · 0 评论 -
即时通讯系统架构
转载请注明:http://blog.csdn.net/herm_lib/article/details/7252329有过几款IM系统开发经历,目前有一款还在线上跑着。准备简单地介绍一下大型商业应用的IM系统的架构。设计这种架构比较重要的一点是低耦合,把整个系统设计成多个相互分离的子系统。我把整个系统分成下面几个部分:(1)状态消息系统 (2)好友系统 (3)P2P系统 (4原创 2012-02-12 13:54:54 · 18431 阅读 · 4 评论 -
系统设计随笔
http://blog.csdn.net/herm_lib1. 确认业务特点。2. 思考先前的设计经验,找出区别点。3. 改进架构,基本确定分布式的策略,初步确定架构。4. 分析各服务器负载,确定节点瓶颈或者节点无瓶颈。5. 初步量化负载,包括接入网络IO,服务间网络IO,后端持久化IO。6. 思考数据存储策略,存储前端是否cache,何种cache方法(全cache, L原创 2012-03-04 22:18:39 · 1261 阅读 · 0 评论 -
基于多线程的大容量MMORPG主逻辑服务器实现策略
转载请标明出处:http://blog.csdn.net/herm_lib/article/details/9079309 实际参与的商业项目而且已运营的服务器,逻辑这块都是一个独立的单线程的,网络跑在其他线程中。像接入服务器,由于他自身的特点,可以尽量利用CPU,做到大负载接入。大部分商业服务器,包括网游服务器,瓶颈还是在于逻辑而非网络,所以接入服务器这块也没有必要的优化。以前总结过原创 2013-06-12 15:53:07 · 3668 阅读 · 1 评论 -
游戏逻辑服务器和数据缓存服务器交互设计策略总结
逻辑服务器[logicd]和缓存服务器[cached]一般有两种结构:分离式结构: logicd--------->cached------->storagelogicd和cached位于两个进程中。嵌入式结构: logicd[cache_lib]-------->storagecached以库的形式内嵌到logicd中,逻辑服务器通过库接原创 2013-08-29 16:24:50 · 2681 阅读 · 0 评论 -
服务器之间的重连总结
考虑已经连接成功的一个tcp连接,应用层发了一个消息包50字节,发了49字节出去后,内网的某个路由端口出故障了原创 2013-09-11 10:15:45 · 2739 阅读 · 6 评论 -
SNS游戏中的数据特征随笔
我们正在开发的一款游戏有MMO的特征,就是有任务,有战斗;同时又存在大量SNS行为,比如某个角色宠物可以找某个离线好友角色的宠物战斗,找离线角色的宠物修行等。估计目前SNS类的游戏都有这两种用户行为。这样我们看游戏中的数据:角色、宠物、道具、任务、成就、好友、修行、其他乱七八糟的数据。这些数据当中,道具、任务和成就数据,没有特殊需求的话,是不存在离线操作的。所以,这类数据的加载、回写和访问可以原创 2012-02-09 17:25:56 · 1423 阅读 · 1 评论 -
一种全局对象ID生成方法
网游中,角色ID、公会ID和道具ID等一般设计成全局唯一。这样做,一个便于跟踪这些对象的生存状态;另外一个是合区不会产生冲突。用大区ID+大区内服务器ID+时间+生成序列生成一个64bits的数字作为全局ID,其中0表示非法的ID。 globalID = cl原创 2011-05-05 21:57:00 · 2143 阅读 · 0 评论 -
SNS游戏中社区Server和游戏Server一种数据交互的策略
SNS游戏和MMO类的游戏最大的区别是不分在线和离线状态。SNS游戏中存在大量的某个角色对另外一个离线角色交互。我们拿农场类游戏举例。像偷菜之类的功能都在社区Server(SS)中实现。偷菜之外,我们可以和另外一个角色进入到某个房间进行PK,最后获得经验和物品等,这类功能我们原创 2011-08-29 17:48:12 · 1379 阅读 · 1 评论 -
多角色的游戏登录流程的一种优化方法
本来是不想这类非常简单的文章的,主要是我们公司有一款大型游戏没有针对这个流程做必要的优化,导致玩家进入游戏前的一些请求给Server带来一点不必要的压力。很多游戏是一个账户下可以创建多个角色。Client 选择服务器后,一般流程:1. 拉取自己帐号下的角色列表原创 2011-08-29 14:19:41 · 1347 阅读 · 0 评论 -
游戏服务器和__gnu_cxx::pool_alloc
pool_alloc是gnu对stl allocator一个扩展实现。位于ext/pool_allocator.h。 pool_alloc实现策略是,当分配的对象大于某个值(我的版本是120bytes)是,就直接用new&delete进行分配和释放。这个策略对于很应用是可接受的,原创 2011-08-30 14:44:09 · 1628 阅读 · 0 评论 -
角色名字所有大区唯一的实现策略
有的公司可能有一个专门角色名字唯一性判断的服务器,名字服务器。这个服务器的目标保证一个大区或者所有大区的名字唯一。所有大区名字唯一有一个好处是,合服的时候不会出现角色名冲突。一个大区唯一的实现策略很直接很容易。这边文章我们尝试讨论所有大区名字唯一的实现策略。先说一个直接的策略原创 2011-08-31 16:44:29 · 2507 阅读 · 1 评论 -
网游服务器和内存碎片
<br />这个看似一个很简单的概念,但有些细节可能会漏掉。<br /> 直接用默认的new(malloc)/delete(free),如果C库内部没有用一个memory pool,kernel肯定会出现碎片。有的C库如果提供一个<br />公用memory pool有没有意义呢?个人认为意义不大,这种情况下,kernel碎片消失了,但C库的pool还是会出现碎片。问题没得到根本<br />的解决,只是碎片从地方转移到另外一个地方而已。有人也有可能实现一个自己的公共的memory po原创 2011-05-20 10:05:00 · 2067 阅读 · 0 评论 -
MMORPG无缝大地图服务器架构设计总结
<br />地图分进程架构和无缝大地图单进程架构<br />有的游戏服务器,一个进程处理一张或多张地图上的逻辑,进入到不同进程的地图,数据须要一个进程间同步的过程。简单合理的同步做法是,先将数据同步到一个公共服务器;进入到目标进程后,再从公共服务器拉取本角色的最新数据。可以参考 http://blog.csdn.net/herm_lib/archive/2011/05/01/6381872.aspx 中的logicsvr1 dbproxy logicsvr2的关系。<br /> <br />分进程架构有他的原创 2011-05-12 13:23:00 · 8592 阅读 · 2 评论 -
大型MMO-SNS类游戏服务器架构
SNS类型的游戏和RPG类的网游有一些不同的特点,而这些特点会导致这类游戏的后台架构和RPG网游的后台架构存在一些区别。SNS类型的游戏一般有以下的特点:(1)所有的玩家角色可能存在交互 SNS类型的游戏一个玩家角色会找他的好友或者其他任何一个毫无关系的玩家角色进行某种逻辑上的互动。(2)这类游戏玩家角色一般是看不见的(3)玩家角色在线或离线状态比较模糊原创 2011-05-01 15:14:00 · 9735 阅读 · 6 评论 -
采用用同步编程的方式实现跨进程异步获取数据[二]-创建玩家账号和获取角色列表
服务器管理多个玩家账号[记作Player], 每个Player维护多个角色列表,角色列表包含简单的角色信息(不是完整的,完整的在Role里面)。原创 2013-09-18 21:47:48 · 2495 阅读 · 0 评论 -
运营活动需求实现
平时游戏运营活动需求,看起来是蛮复杂的。其实本质上任务系统或者成就系统类似。一般需求像这样:1. 活动有开始时间和结束时间要求;2. 活动给出的奖励也有开始时间和结束时间要求;3. 完成活动需要做完几件事情(我们称作事件或者条件事件);4. 相比较任务和成就系统,这种活动条目很少。分享一下我们的做法:1. 独立实现一个活动服务器,存储的DB也是独立。这样的好处是原创 2014-10-15 23:54:51 · 2940 阅读 · 0 评论 -
我们的手游服务器3个月内宕机1次
我们开发的一款数码宝贝OL的手游,上线3个月后,保持着稳定得运行,1个月维护一次。每个服务器进程保持着稳定得运行。唯一一次宕机是因为业务逻辑代码,读取数码兽数据的时候,程序小兄弟没有对返回的数据指针做保护。还有一次是目录服务器,无法连接,连接数竟然满了,是因为,目录服务器配置文件没有配置心跳检测时间。这块心跳检测机制须要作一个简单的调整,默认开启一个3~5分钟的定时器检测连接是否失效。原创 2014-12-04 19:52:46 · 2562 阅读 · 0 评论 -
采用用同步编程的方式实现跨进程异步获取数据[一]
异步获取数据,我这边采用了一点点小技巧,这样异步获取数据的操作,变成和同步操作一样自然。原创 2013-09-14 17:59:27 · 3194 阅读 · 0 评论 -
MMORPG类网络游戏的典型架构
转载请注明:http://blog.csdn.net/herm_lib/article/details/7284697MMORPG的特点是角色之间一般可见;有不同类型的地图,包括开放地图(城市、村庄等)和封闭地图(副本、大型战场和小型PK房间等);有各种RPG组织元素(如公会、家族等)。架构设计逻辑服务器部分的出发点是根据上面的特点设计的。一般可以用下面的架构:原创 2012-02-22 21:18:57 · 5065 阅读 · 0 评论 -
记录 异步请求机制
系统简单结构client--->[logicd1, logic2]--->cached从client过来的消息分发给先前注册的HandlercsMsgDispatcher->Dispatch(buf, len, param);buf + len就是表示cs message。param附加参数,后面将用到。从cached也有消息发过来,和cs消息处理方法一原创 2012-12-09 18:03:15 · 1256 阅读 · 0 评论 -
MMO-SNS类游戏服务器间数据交互策略分享
MMO-SNS类游戏是一种在线角色之间存在交互,同时在线角色又可以同离线角色交互的游戏。这两种交互行为,决定了不同服务器之间的数据交互和常见的MMO类游戏存在很大差别。这类型一般会有下面两种类型的主服务器。OnlineSvr实现一些MMO的业务逻辑,实现像做任务、战斗、NPC AI、视野管理和消息同步等行为。OfflineSvr 实现一些离线类的SNS业务逻辑。注意,这个服务器涉及到操作离原创 2012-03-09 20:48:55 · 2320 阅读 · 0 评论 -
游戏网关服务器性能优化的一种方案
这里的网关服务器(简称gated吧)是指逻辑服务器前面的那排服务器,一般有几个主要功能: (1)接入 (2)加解密 (3)解缩压gated一个特点是不处理逻辑,每个连接之间不存在交互关系,这点非常关键,是我这个优化方案的基础。上面(2)(3)两项目是很吃CPU的,而目前的机器一般是X个CPU,Y个核的,我们可以通过多线程的方式,更好利用机器硬原创 2011-12-20 10:33:48 · 4111 阅读 · 7 评论 -
高效的成就系统实现简介
什么是成就成就系统可以理解为对某个角色成长过程重大事件的记录;玩家通过查看成就跟踪角色涉及的重大事件。成就的策划模版数据ID, 这个成就的唯一标识;Name, 命名;EventCategroy, 完成的事件对应的类型,类型是对各种事件大一个范围的分类;EventCategroy2, 实际需求中可能有多种类型;EventID1, 完成的事件ID,事件是指游戏中自定义各种事件,比如升级事件、完成多少任务事件等;EventValue1, 上面的事件ID对应的值, 如升到20级,完成了1000次任务等;。。。Eve原创 2011-02-18 16:49:00 · 5175 阅读 · 1 评论