netty在游戏服务器开发中的应用(一)

一,为什么选择netty

    游戏服务器所处理的数据是面是多客户端的。而且游戏对数据处理的响应速度要求非常高,要不然就会出现服务器卡的现象,影响玩家在游戏中的体验。要处理好游戏数据的响应速度,首先第一步就是解决网络传输这一层,这相当于数据出入服务器的大门,如果这一块出现了慢的问题,那将会直接影响整个游戏服务器的性能。


   说到前后端的数据通信,我们首选想的是Socket,没错,这是唯一的选择,就算是http协议,他底层也是封装的Socket TCP/IP协议。Socket Tcp/IP协议好的处是一次建立连接,可以多次通信,不用每次都建立通信通道,节省系统资源。但是在Socket设计模式上,有阻塞和非阻塞之分,或者叫BioNioJava最新的版本目前都支持NIO,它就是为了处理数据并发,提高系统性能而生的。毫无疑问,游戏服务器只能使用NIO来实现。但是Java原生的NIO API非常繁琐,它虽然给开发者留足了灵活性,但是也给开发者建立一个高性能,高安全性带来了考验。如果开发者经验不足,自己去开发一套适用的NIO处理框架,可能需要很多测试或者会出现很多意外的了Bug,虽然最后都可以解决,但是延长了开发时间和付出一些额外的代价。


    Netty,做为一个经久考验和实际应用的网络框架,功能都得到了实际测试,安全性高。利用netty,可以为我们开发省去不少的时间和维护精力,至少我们不用时时担心网络层会出现什么大的问题。



二,netty的异步处理



    在IO编程过程中,当需要同时处理多个客户端接入请求时,可以利用多线程或者IO多路复用技术进行处理。IO多路复用技术通过把多个IO的阻塞复用到同一个select的阻塞上,从而使得系统在单线程的情况下可以同时处理多个客户端请求。与传统的多线程/多进程模型比,I/O多路复用的最大优势是系统开销小,系统不需要创建新的额外进程或者线程,也不需要维护这些进程和线程的运行,降低了系统的维护工作量,节省了系统资源。


    JDK1.4提供了对非阻塞IONIO)的支持,JDK1.5_update10版本使用epoll替代了传统的select/poll,极大的提升了NIO通信的性能。NettyIO线程NioEventLoop由于聚合了多路复用器Selector,可以同时并发处理成百上千个客户端Channel,由于读写操作都是非阻塞的,这就可以充分提升IO线程的运行效率,避免由于频繁IO阻塞导致的线程挂起。另外,由于Netty采用了异步通信模式,一个IO线程可以并发处理N个客户端连接和读写操作,这从根本上解决了传统同步阻塞IO一连接一线程模型,架构的性能、弹性伸缩能力和可靠性都得到了极大的提升。


三,零拷贝



Netty的“零拷贝”主要体现在如下三个方面:


1) Netty的接收和发送ByteBuffer采用DIRECT BUFFERS,使用堆外直接内存进行Socket读写,不需要进行字节缓冲区的二次拷贝。如果使用传统的堆内存(HEAP BUFFERS)进行Socket读写,JVM会将堆内存Buffer拷贝一份到直接内存中,然后才写入Socket中。相比于堆外直接内存,消息在发送过程中多了一次缓冲区的内存拷贝。



2) Netty提供了组合Buffer对象,可以聚合多个ByteBuffer对象,用户可以像操作一个Buffer那样方便的对组合Buffer进行操作,避免了传统通过内存拷贝的方式将几个小Buffer合并成一个大的Buffer



3) Netty的文件传输采用了transferTo方法,它可以直接将文件缓冲区的数据发送到目标Channel,避免了传统通过循环write方式导致的内存拷贝问题。



四,内存池



    随着JVM虚拟机和JIT即时编译技术的发展,对象的分配和回收是个非常轻量级的工作。但是对于缓冲区Buffer,情况却稍有不同,特别是对于堆外直接内存的分配和回收,是一件耗时的操作。为了尽量重用缓冲区,Netty提供了基于内存池的缓冲区重用机制



五,高效的Reactor线程模型



常用的Reactor线程模型有三种,分别如下:


1) Reactor单线程模型;


2) Reactor多线程模型;


3) 主从Reactor多线程模型


Reactor单线程模型,指的是所有的IO操作都在同一个NIO线程上面完成,NIO线程的职责如下:


1) 作为NIO服务端,接收客户端的TCP连接;

 

2) 作为NIO客户端,向服务端发起TCP连接;

 

3) 读取通信对端的请求或者应答消息;


4) 向通信对端发送消息请求或者应答消息。


转自:http://www.youxijishu.com/view/7


游戏技术公众号,扫描加入讨论游戏技术




  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
jaca视频教程 jaca游戏服务器开发 Netty NIO AIO Mina视频教程 课程目录: 一、Netty快速入门教程 01、第一课NIO 02、第二课netty服务端 03、第三课netty客户端 04、第四课netty线程模型源码分析(一) 05、第五课netty线程模型源码分析(二) 06、第六课netty5案例学习 07、第七课netty学习之心跳 08、第八课protocol buff学习 09.第九课自定义序列化协议之自定义序列化协议 10、第十课自定义数据包协议 11.第十一课粘包分包分析,如何避免socket攻击 12.分析设计一个聊天室的小项目 二、java NIO,AIO编程视频教程 1、java NIO,AIO编程_01.flv 2、java NIO,AIO编程_02.flv 3、java NIO,AIO编程_03.flv 4、java NIO,AIO编程_04.flv 5、java NIO,AIO编程_05.flv 三、Java语言基础教程-Java NIO流篇 [第1节] Java NIO流-简介和概述.flv [第2节] Java NIO流-缓冲区.flv [第3节] Java NIO流-缓冲区操作.flv [第4节] JavaNIO流-通道1.flv [第5节] Java NIO流-通道2.flv [第6节] Java NIO流-socket通道操作.flv [第7节] Java NIO流-文件通道操作.flv [第8节] Java NIO流-选择器 .flv [第9节] Java NIO流-选择器操作.flv 四、Mina视频教程 00、Mina视频课程介绍.flv 01、Mina服务端helloWorld入门.flv 02、Mina客户端helloWorld入门.flv 03、Mina整体体系结构分析.flv 04、Mina学习之长短连接.flv 05、Mina学习之MinaIOService接口.flv 06、Mina学习之MinaIOFilter接口.flv 07、Mina学习之MinaIOSession接口.flv 08、Mina学习之MinaIOProcessor线程模型.flv 09、Mina学习之MinaIOBuffer接口.flv 10、Mina学习之自定义协议介绍.flv 11、Mina学习之自定义协议数据包分析.flv 12、Mina学习之自定义协议数据包实现.flv 13、Mina学习之自定义协议-编码器.flv 14、Mina学习之自定义协议-解码器.flv 15、Mina学习之自定义协议-服务端实例.flv 16、Mina学习之自定义协议-客户端实例.flv

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值