posts - 11, comments - 9, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

Netty整理和基于Netty封装了一个web game通讯层

Posted on 2012-05-15 17:09 steven.cui 阅读(13437) 评论(7)  编辑  收藏 所属分类: java

NIO的理解,请参照:http://www.goldendoc.org/category/java-nio/

Netty的一些理解,请参照:

http://www.kafka0102.com/2010/06/167.html

http://rdc.taobao.com/team/jm/archives/423


Netty的高可靠性,可伸缩性,以及效率的确让人着迷,为什么Netty这么快呢?

Netty高效的原因:

  1. 实现了多路Selector用于读和注册,线程数量是cpu*2,reactor都是这么做的,自己处理写事件,这个我在自己框架中也是这么做的,nio的selector处理注册和读,并且也优化了wakeup,Netty中的wakeup也是优化过的,本身一次wakeup对Nio并不大,但是大批量并发的时候就需要进行优化处理了,只有当selector堵塞的时候进行wakeup,或者说需要下次立刻返回的时候wakeup。
  2. Netty在开启多路读写的时候,用的是DirectBuffer,并用了SoftReferrence来做缓存优化,减少传输数据的内存移动和GC。还有预测数据算法,这个具体能不能提高有待讨论
  3. 并发的控制,基于SEDA的设计理论构建的高效事件模型,真正的异步处理,吞吐量和伸缩性都可以得到保证。


nio的实现并不复杂,但想让你的底层通讯,效率,以及可伸缩性和高可靠性做好,还是极具挑战性的。


目前有个项目是自己写的nio,但效率比起netty来,小了几个数量级,当然以本人一己之力能做到目前这个情况,还算自己满意,也用到生产环境中了,一个web game,及时性要求很高,一台server,5000人没问题。同时广播消息在10000人以内,当然有些优化是在业务逻辑层面的。当然比起netty的效率来讲还是差了几个数量级。


除了高效,Netty在扩展性方面做的不错:

  1. 丰富的decoder/encoder实现,你可以轻松的继承一个类实现自己的逻辑,例如游戏中,直接继承FiledLengthBaseFrameDecoder即可。
  2. 自行添加decoder或者encoder,自由的控制事件流向顺序,通过这个,可以实现一些协议加密解密,协议过滤器,统计工具等等
  3. 提供很多工具类:Timeout的一些实现,还有ChannelBuffers的一些工具,通常情况下,我们为了减少对Netty的依赖,会自己再封装一层,以完全达到脱离Netty的目的,都会再次封装一层ChannelBuffer,这样目的是不要让上层逻辑跟底层通讯有任何关联,降低耦合,当然也在为考虑更换底层通讯而不影响上层逻辑。
  4. 提供监听底层消息的ChannelFuture,例如发送完消息可以断开连接等等
  5. 可调控的通讯架构,可以根据业务的吞吐量来调整,Netty的各项参数不只有socket的一些设置,还能控制事件流顺序和吞吐量的大小等等。


最后,基于Netty我简单封装了一个web game所具备的一些GameBuffer,目前比较简陋,后续可能加入一些别的功能。


项目在:https://github.com/cuixin/XGameEnginee/



评论

# re: Netty整理和基于Netty封装了一个web game通讯层  回复  更多评论   

2012-08-19 19:02 by rabee
你好,一直使用mina,刚开始研究netty,还没在生产环境中使用,看了你的框架有些疑问,还望指教

# re: Netty整理和基于Netty封装了一个web game通讯层  回复  更多评论   

2012-08-20 10:59 by steven.cui
@rabee 有什么问题请讲

# re: Netty整理和基于Netty封装了一个web game通讯层  回复  更多评论   

2012-09-29 12:11 by javavaj
你好,看了下你的代码,GameWorker是单线程吗?

# re: Netty整理和基于Netty封装了一个web game通讯层[未登录]  回复  更多评论   

2012-12-07 18:32 by tony
你好,我也做了两年游戏,想和你有进一步的沟通,我的邮箱:yong_xiaoyang@126.com,希望收到你的回复,谢谢!

# re: Netty整理和基于Netty封装了一个web game通讯层  回复  更多评论   

2013-02-20 19:13 by 勤奋的asialee
博主这块写的挺好的,我完全看了,不过我也写了一些关于编解码器的,请批评指正http://asialee.iteye.com/blog/1769508

# re: Netty整理和基于Netty封装了一个web game通讯层[未登录]  回复  更多评论   

2013-07-20 00:06 by wade
你好,你的代码我有研究过,写的很不错,但是我想问下你,怎么做到把消息队排分开,提高游戏引擎吞吐量

# re: Netty整理和基于Netty封装了一个web game通讯层  回复  更多评论   

2013-08-02 15:11 by steven.cui
@wade
目前我在研究erlang,java可以借鉴erlang的多进程并发思想来做,Actor/SEDA设计模型可以增加吞吐量和并发,如果你有C和lua经验,可以参考云风的skynet,当然还可以考虑Scala或者Clojure,Scala本身支持函数式,更有Actor模型存在,也有很多国内的朋友在用Scala写游戏服务器。

另外一个无锁的消费生产者模型,Disruptor,如果你有能力自己实现Actor/SEDA模型,可以将Disruptor嫁接进来。

游戏服务器的难度设计在于几点:
1.多服务器的通讯和稳定,以及各种容错机制,热更新。
2.快速迭代的测试模型和性能验证模型。(解决上下文的关联问题,我能想到的是尽量利用函数式语言来做)
3.监控和相应的配置工具,目前Erlang的体系的确是很强大,帮你做了很多。

至于XGameEnginne,我们之前的上线游戏,都是通过业务逻辑的方式分配线程,此方法不算是特别智能,但也在一定程度上可以解决部分并发的问题,其实Erlang来做的话也可以这么设计,但却比Java有更好的办法,毕竟Erlang对进程的开销实在太小了。

最后,选择有很多,不要让语言成为你的限制,当然这是扯淡,关键是要找合适的:D

只有注册用户登录后才能发表评论。


网站导航: