一直不知道题目怎么起。因为表诉的东西可能比较碎。
本意是分享一下用RD开发的一些经验。so 废话少说了。
当初在做技术选型的时候,很是纠结了一把,网络服务端一般都是C++的天下。Java因其性能问题一直上不了大台面。
不过换个角度来看问题,也许不一样。毕竟大部分网络游戏是桌面端的,很多桌面端的游戏因为3D方面的原因而选了C++.
貌似大部分游戏物理引擎都是C++的。这样为了使通讯协议设计不需要夸语言。又考虑到性能自然就选了C++做服务端,另外还有一些历史原因。
最后游戏确定差不多是棋牌方面的游戏,考虑到对游戏实时性要求不高,并且对传输协议的要求只是TCP,就考虑了RD.
之前用MINA差不多写了一个测试服务端,不过需要顾及到数据持久与同步。然后还要考虑到并入房间等问题(开发效率低)就放弃了。毕竟这套东西RD都帮你实现了。MINA也只是帮你实现了通讯与任务的线程池而已,自己还要处理粘包等问题。
开工前的熟悉下这个东西,网上有中英文资料。大致的看一下以及他的例子也许就能动手了。但这里有几个很重要的地方需要注意。是我开发中体会到的
- RD不是如它宣传的那样支持多节点。目前多节点还在开发中
- 多线程对开发人员透明,并不代表不需要考虑。(开发者应该清楚哪里会存在并发)
- 所有的对象方法都是Task,所有的Task要尽可能的短,不要超过100m,虽然可以调的更高(天堂2 java模拟器也是这个值)
- 注意ManagedObject接口,这个是RD的核心,也是最容易内存泄漏地方。
- channel的join与leave 应该是配套调用的。另外一点channel不要频繁的remove.创建channel是很耗资源的。会导致全GC
- 并不是所有实现Serializable接口地方必须实现ManagedObject
- 关注持久到DB里的数据层次结构,结构设计的好,对系统是速度质的提升
- 但凡越到要实现ManagedObject的类请不停的提醒自己上面一条规则
经验不多但足以使用了,这里的重点就是ManagedObject这个接口。这个也是RD核心之核心 for why?
RD有四个基本服务构造而成,这也是它的优秀的地方,服务是可配置可插拔的。
四个基本服务分别是
数据服务 DataService
任务服务 TaskService
会话服务 SessionService
通道服务 ChannelService
其中数据服务 DataService是核心,因为RD所有的操作都可以序列化到DB里,都是通过DataService,一开始个人很郁闷。这多慢啊,任何一个操作都是读数据库操作然后写数据库,完了之间可能还有并发调度会导致回滚。
于是开始思考这种架构的目的,可行性,看了官方的游戏貌似跑的不错,但还是不太理解其含义直到看完《架构之美》的3.4.1这一节才了解。(个人觉得还是有点极端)
RD把所有的操作都进行了可移植性抽象,其把游戏里所有的数据都序列化到硬盘上,然后通过集群无缝的分发到不同的服务器上,这里实现的负载可以到达完美的性能负载,而不是现在的网络游戏的地图负载,AI负载等等地图负载还是会有空闲的机器与忙的不得了的机器。
通过对玩家的操作数据序列化 分发到多个RD服务器来达到负载以及最大面积的服务器性能使用,似乎想的不错。不过这里不可避免的会出现延迟,这点是我纠结也是最具有争议的地方,也是促使我研究RD源码的地方
不知道将来是否RD会在数据库与逻辑层之间架起一个缓存层,这样可以对当前活跃的操作转移会快一点。个人有这个设想。
目前给予延迟的解决方案是根据游戏的逻辑将活跃的对象转移到一台服务器上,比如攻城战的时候把玩家数据转移到一台服务器上,这样就避免了多台服务器的传输延迟,(这里基于任务的序列化存储 发挥了负载的功能)然后设定这类高负载服务器的线程池大一点,充分利用多核技术,可以提高并发的访问速度,达到接近内存的速度。
上面是《架构之美》的解释,的确RD在网络游戏上的架构有独特的方式,牺牲一点性能换来高效率的负载,但是否适合您的游戏这得你自己掂量。个人觉得除了FPS类型的游戏,基本都可以用RD。即使是WOW这种MMO游戏也可以胜任,也许C++写的可以带1000个人,RD写的可能只能带700人,但是用RD写的服务端不存在分区的概念,所有的玩家均匀的分布在服务器上,大面积的战斗可以随时把操作通信频繁的一群玩家拉到一台服务器上。从而降低通信延迟(服务器之间的通信延迟)。
任务服务 TaskService:
这是个什么东西呢?在RD里所有的操作都会排列在任务队列里,由任务线程来处理每个任务,这也就是为什么任务执行时间不能太长的原因,RD会按着先来后到的顺序执行任务,所以网速慢会发生延迟的现象,因为你的包是后到服务端。
另外任务超时会被做一个标记,尝试25次之后会被Abort.(文档是这样写的,实际上可能不是,有机会深入源码再给出个人肯定的断定)。这里就有个疑问什么是Task?难道通过TaskManager搞出来的就是Task吗?非也。RD里一切的操作都是建立的任务调度池上的。包括你发送包,访问数据库等等。这一切都是任务,都必须在100m里完成。(这里100ms是指的每一次事务,不是上面所有的操作)
记得在群里有个哥们说他们不用MO只用Task,我个人估计他们可能没有理解MO与Task之间的关系以及MO的重要性。
会话服务 SessionService
通道服务 ChannelService
这个是几乎所有网游必备服务—-通信。Session会话简单点来讲就是端对端的直接通信,当然这里的端是指服务器。
在RD里你只需要理解 ClientSession 接口与 ClientSessionListener接口就基本可以了。看完这两个类的方法基本就知道怎么通信了。当然这里还需要配套的客户端API。(SUN还是很重架构,很多东西抽象的有点过头。)Channel之意就是一群人在一个小组里,简单点说就是一个XXQ群,你一个人说话,群里的人都可以收到。主要方法都在Channel ,ChannelListener这两个接口里 ,第二个接口主要是对信息内容进行过滤的
上面是RD最基本也是最重要的架构与接口,其他比如大面积多节点的集合,大家可以查看他的内部API,另外我们还可以自己定义扩展服务器的service 以及传输方式(加入UDP支持 P2P支持)以及自定义验证,这些我会抽时间讲讲个人经验。
相关推荐
opc Client OPC Server/OPCClient OPCServer 客户端/服务端程序/kepserver源码 1、有使用java开发opc client 源码 2、c++开发 opc server、opc client源码 3、满足数据采集的opc da协议、opc ua协议 有源码,有封装...
本压缩包包含的是使用Mina Server开发的服务端和客户端的源代码示例,非常适合初学者和有经验的开发者用来学习和参考。 服务端开发: 在Mina中,服务端通常通过创建一个Acceptor来监听特定的端口,等待客户端的连接...
实现对TCP/UDP测试,灵活搭建测试客户端和服务端通信,验证网络通信状态,验证端口状态
d ...
VC 编写一款可边下载、边聊天的多线程下载服务端、客户端程序,都可顺利编译,可指定IP进行连接,连接成功后,可进行对话,单对单的聊天,比较简单。服务端和客户端基于多线程,支持多任务。 在上图中,烈火...
【项目介绍】: 使用说明 命令行方式 分别导入HBase和Hive项目 运行Hive服务端 "/mnt/hgfs/yyx/apache-hive-1.0.1-bin/hiveserver2"(此目录实际情况会有变化) 运行HBase服务端 "/mnt/hgfs/yyx/hbase-0.98.18-...
安卓SOCKER 局域网聊天服务端/客户端源码,测试好用。
【Axis 服务端/客户端 样例】是一个用于学习和实践Axis框架的示例资源包。Axis是一个开源的Web服务工具包,它主要用于构建和部署基于SOAP(简单对象访问协议)的Web服务。这个资源包涵盖了 Axis 1.4 的完整二进制...
总结,邮件管理系统的服务端和Web接口开发是复杂而重要的任务,C#作为开发语言,提供了强大的工具和框架支持,能够帮助开发者高效地构建功能完备、安全可靠的邮件管理系统。理解并熟练运用这些知识点,对于提升企业...
配套说明: http://blog.csdn.net/gogoytgo/article/details/79420745
微信小程序服务端开发demo(源代码+截图)微信小程序服务端开发demo(源代码+截图)微信小程序服务端开发demo(源代码+截图)微信小程序服务端开发demo(源代码+截图)微信小程序服务端开发demo(源代码+截图)微信小程序...
该项目为Minecraft(我的世界)底层功能提供了Go语言的实现,支持纯Go服务端与客户端开发。源码包含344个文件,其中Go语言编写文件292个,辅以11个Minecraft自定义文件、7个Minecraft数据文件、5个SNBT数据文件、5个...
NetAssist网络调试助手,是Windows平台下开发的TCP/IP网络调试工具,集TCP/UDP服务端及客户端于一体,是网络应用开发及调试工作必备的专业工具之一,可以帮助网络应用设计、开发、测试人员检查所开发的网络应用软/...
本教程将详细讲解如何利用Java Socket实现基于TCP/IP的服务端和客户端之间的报文发送与接收。 TCP(传输控制协议)是一种面向连接、可靠的传输协议,它确保了数据包的有序和无损传输。IP(互联网协议)则是互联网上...
在IT行业中,Web服务端开发是一项至关重要的技能,它涉及到构建和维护运行在服务器上的应用程序,这些应用程序能够处理来自Web客户端(如浏览器或移动应用)的请求,并返回相应的数据或执行特定的操作。在这个场景中...
本资料集主要涵盖了在EAS BOS开发服务端时的一些常见代码示例和实践,对于理解并掌握EAS BOS的开发具有较高的参考价值。 1. **EAS BOS基础架构**: EAS BOS基于J2EE架构,提供了一整套开发工具和框架,包括模型...
Android TCP测试demo,包含apk和源码,支持十六进制发送接收,以太网和wifi的IP获取以及网线插拔监听,Android Things 1.0版本与Android 8.0均测试通过。WIFI和网线均可通信。可参看博文UI功能...
描述中的“opc ua 客户端与服务端开发demo, opc ua客户端与服务端控件源码”表明,该压缩包可能包含示例代码和源码,用于展示如何构建OPC UA的客户端和服务端应用。这可能是用特定编程语言(如C#、Java或Python)...
【标题】:“CXF开发Web服务端” 在Java世界中,Apache CXF是一个流行的开源框架,用于构建和部署Web服务。它支持多种Web服务规范,包括SOAP、RESTful API以及WS-*扩展。CXF允许开发者以Java SE或Java EE环境轻松...
压缩包中二个项目文件夹 1.MySocketServer(C#服务端及客户端) 2.MyTestsocket(android客户端) socket通信demo并未实现过多功能,主要演示通信,更多功能自己开发,哈哈!