百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

基于NIO的高速数据传输技术的实现

haoteby 2025-05-08 18:31 9 浏览

郭金磊,张玉生,胡爱兰

(华北计算机系统工程研究所,北京 100083)

:随着大数据技术的发展,多线程高并发等技术已经越来越成为大数据处理中的关键技术。非阻塞式I/O(new I/O,NIO)技术作为一种分布式高并发技术被广泛应用,但对于大数据量的通信往往需要很多的时间才能完成。Google提出的Protocol Buffer序列化压缩技术相对于传统序列化效率高、时间短、使用简单。文章将传统NIO技术与Protocol Buffer相结合,在分布式系统不同节点通信中,极大地降低了分布式系统的网络负载,大大节省了数据传输时间。

:NIO(new I/O);Protocol Buffer ;分布式系统;序列化

随着大数据技术的发展,多线程高并发等技术已经越来越成为大数据处理中的关键技术,同一个节点中的不同线程和不同节点的线程间的通信越来越密切。Java NIO作为一种分布式数据传输技术在多线程高并发[1]的实际应用中扮演着至关重要的角色。为减小网络负载,加速分布式系统中网络通信,迫切需要一种高效率压缩序列化技术。

1研究现状

Java NIO的核心是Channel、Buffer 和 Selector。NIO基于通道(Channel)和缓冲区(Buffer)进行操作,通道先在选择器注册读写事件,读数据时,当选择器发现该通道准备读完成,通道直接将数据从底层网卡队列读进缓冲区。写数据时,当选择器发现该通道准备写完成,通道将数据写进缓冲区。通道可以实现在缓冲区中对每个字节类似于指针对数据操作,可以来回移动读取数据。选择器可以用一个单独的线程同时监听管理多个通道。

传统的NIO[2]都是使用Java自带的序列化形式对传输数据和对象进行序列化压缩。这种情况下,数据压缩率[3]较低,需要传输的对象数据流很大时,尤其在分布式系统中,容易造成网络拥堵。本文在传统NIO技术的基础上结合Google Protocol Buffer技术实现了数据对象的高效序列化压缩传输。

2Protocol Buffer优点

Google Protocol Buffer(简称Protobuf)是Google公司提出的混合语言数据标准,用于 RPC 系统和持续数据存储系统。同时也可用于通信协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。目前提供了C++、Java、Python三种语言的API。Protobuf 具有很多优点:实现简单,压缩速度快,传输速度快,存储空间小。用Protobuf与Java自带的序列化工具实现的对象压缩相比,存储空间大了一个数量级,时间上快了一个数量级,尤其是可以自动生成远程过程调用协议(Remote Procedure Call Protocol, RPC)的数据结构,特别是service业务逻辑,是一种很好地实现RPC的自动化工具。Protobuf 编译器会将.proto文件编译生成对应的数据结构以对Protobuf数据进行序列化、反序列化操作。

以最简单的一个对象Person(仅有三个属性:姓名、年龄和住址)为例,用Java自带的序列化工具与Protobuf来对比。使用Java自带的序列化工具,经过压缩后的数据是181 B,如图1所示。

而当采用Protobuf时,如图2所示,占用空间仅有20 B,而且实现简单,压缩速度快,传输速度快,反序列化也快。可以很好地实现分布式高并发式的数据传输,大大降低了网络传输负载。

压缩person对象时间和大小对比如表1所示。

3简单实例实现

本文根据Protobuf的优点在NIO的基础上实现了一个分布式的高并发、高传输效率的项目。系统采用多个一级引擎来处理原始日志数据,读取后进行分段,分段后采用Hash映射到多个二级引擎(可以任意台Hash映射)中进行数据融合,融合后的数据再汇总到一台服务器上,客户端可以通过远程Web访问这个服务器上的数据。其中一级引擎与二级引擎之间的数据传输就是使用的NIO与Protobuf相结合的技术,如图3所示。

图3分布式NIO结构示意图客户端使用Protobuf对数据序列化压缩发送。

ListrpcList = new ArrayList ;//实例化发送数据

for(HTTPAPPHost hah : list){

RPCHah rpchah = RPCHah.newBuilder

.setCellid(hah.getCellid).setAppType(hah

.getAppType).build;

rpcList.add(rpchah);//将原始list转化为RPCList完成

RPCReq req = RPCReq.newBuilder

.addAllHahs(rpcList).build;//序列化压缩完成

if(e2info.getDataQueue.offer(req.toByteArray)){//调用网络模块,将数据发送到二级引擎

NIOClientRunner.sendData(e2info); }//发送数据

服务器端采用NIO接收数据并使用Protobuf反序列化及处理。

Selector selector=Selector.open;//开启选择器

ServerSocketChannel ssc=

ServerSocketChannel.open;

ssc.configureBlocking(false);//配置为非阻塞模式

ssc.register(selector, SelectionKey.OP_WRITE);

while(isRunning){

selector.select(1);//阻塞延时1ns

Set set=selector.selectedKeys;

Iterator<SelectionKey> it=set.iterator;

while(it.hasNext){

SelectionKey skey=it.next;

if(skey.isReadable){//选择读数据通道

SocketChannel sct = skey.channel;

ByteBuffer tempBuf=

ByteBuffer.allocate(1);

String dataStr="";

while(!dataStr.endsWith("\\r\\n")){

sct.read(tempBuf);

dataStr +=new String (tempBuf.array);

tempBuf.clear;}//防止粘包

byte[] data= dataStr.array;

recoverData2List.handlerData(engine1Info, data); }

下面服务器端把data数据反序列化。

List<RPCHah> pcList=request.getHahsList;

for(RPCHah rpchah : rpcList){

HTTPAPPHost hah = new HTTPAPPHost;

hah.setCellid(rpchah.getCellid);

hah.setAppType(rpchah.getAppType);

Global.getDataQueue.put(hah);//将反序列化的对象存储到dataQueue中,反序列化完成

}

表2是一级引擎向二级引擎发送17 980条实例HTTPAPPHost对象数据与Java自带序列化的数据传输这些数据量的效率对比。

本文在传统NIO的基础上结合了Proto Buffer,使得压缩后的数据量大致是原来的1/9,压缩时间上大致是原来表2实际环境序列化rpcList对象

时间和大小对比ProtobufSerializable序列化时间/ns7466 687反序列化时间/ns95141 083数据大小/B2 084 93918 707 213的1/8,反序列化时间大致是原来的1/40,极大地提高了传输的效率,降低了网络负载[4]。

4结论

本文在传统NIO的基础上应用Protobuf后,能够使得分布式高并发下性能极大提升,网络负载大大减小,优化性能明显,尤其在以Map Reduce[5]为核心技术的大数据处理应用中性能更为突出。

参考文献

[1] GOETZ B,PEIERLS T,BIOCH J,等.Java并发编程实战[M].童云兰,译.北京:机械工业出版社,2012.

[2] 李林锋.Netty权威指南[M].北京:电子工业出版社,2014.

[3] 程超,杨风召.基于Java非阻塞I/O开发高性能网络应用程序[J].电子工程师,2006,32(10):7173.

[4] 徐忠胜,沈苏彬.一种云计算资源的多目标优化的调度方法[J].微型机与应用, 2015, 34(13):1720.

[5] 元二菊,郭进伟,皮建勇,等.基于MapReduce的序列规则在推荐系统中的研究[J].微型机与应用,2014,33(6):6870,73.

相关推荐

网站seo该怎么优化

一、网站定位在建设一个网站之前,我们首先要做的就是一个网站清晰的定位,会带来转化率相对较高的客户群体,我们建站的目的就是为了营销,只有集中来做某一件事,才会更好的展现我们的网站。在做SEO优化的同时...

3个小技巧教你如何做好SEO优化

  想半路出家做SEO?可是,怎么才做的好呢?关于SEO专业技术弄懂搜索引擎原理,咱们做搜索引擎排名的首先就是要了解搜索引擎的工作原理,对SEO优化有更深入了解之后再来做SEO,你就能从搜索引擎的视点...

SEO指令分享:filetype指令

filetype用于搜索特定的文件格式。百度和谷歌都支持filetype指令。比如搜索filetype:pdf今日头条返回的就是包含今日头条这个关键词的所有pdf文件,如下图:百度只支持:pdf...

网站seo优化技巧大全

SEO在搜索引擎中对检索结果进行排序,看谁最初是在用户的第一眼中看到的。实际上,这些排名都是通过引擎的内部算法来实现的。例如,百度算法很有名。那么,对百度SEO的优化有哪些小技巧?下面小编就会说下针对...

小技巧#10 某些高级的搜索技巧

由于某些原因,我的实验场所仅限百度。1.关键词+空格严格说来这个不能算高级,但关键词之间打空格的办法确实好用。我习惯用右手大拇指外侧敲击空格键,这个习惯在打英文报告时尤其频繁。2.site:(请不要忽...

MYSQL数据库权限与安全

权限与安全数据库的权限和数据库的安全是息息相关的,不当的权限设置可能会导致各种各样的安全隐患,操作系统的某些设置也会对MySQL的安全造成影响。1、权限系统的工作原理...

WPF样式

UniformGrid容器<UniformGridColumns="3"Rows="3"><Button/>...

mysql自动备份,并zabbix检测备份文件是否正常,备份文件大小

推荐...

MySQL学到什么程度?才有可以在简历上写精通

前言如今互联网行业用的最多就是MySQL,然而对于高级Web面试者,尤其对于寻找30k下工作的求职者,很多MySQL相关知识点基本都会涉及,如果面试中,你的相关知识答的模糊和不切要点,基...

jquery的事件名称和命名空间的方法

我们先看一些代码:当然,我们也可以用bind进行事件绑定。我们看到上面的代码,我们可以在事件后面,以点号,加我们的名字,就是事件命名空间。所谓事件命名空间,就是事件类型后面以点语法附加一个别名,以便引...

c#,委托与事件,发布订阅模型,观察者模式

什么是事件?事件(Event)基本上说是一个用户操作,如按键、点击、鼠标移动等等,或者是一些提示信息,如系统生成的通知。应用程序需要在事件发生时响应事件。通过委托使用事件事件在类中声明且生成,且通过...

前端分享-原生Popover已经支持

传统网页弹窗开发需要自己处理z-index层级冲突、编写点击外部关闭的逻辑、管理多个弹窗的堆叠顺序。核心优势对比:...

Axure 8.0 综合帖——新增细节内容

一、钢笔工具与PS或者AI中的钢笔工具一样的用法。同样有手柄和锚点,如果终点和起点没有接合在一起,只要双击鼠标左键即可完成绘画。画出来的是矢量图,可以理解为新的元件。不建议通过这个工具来画ICON图等...

PostgreSQL技术内幕28:触发器实现原理

0.简介在PostgreSQL(简称PG)数据库中,触发器(Trigger)能够在特定的数据库数据变化事件(如插入、更新、删除等)或数据库事件(DDL)发生时自动执行预定义的操作。触发器的实现原理涉及...

UWP开发入门(十七)--判断设备类型及响应VirtualKey

蜀黍我做的工作跟IM软件有关,UWP同时会跑在电脑和手机上。电脑和手机的使用习惯不尽一致,通常我倾向于根据窗口尺寸来进行布局的变化,但是特定的操作习惯是依赖于设备类型,而不是屏幕尺寸的,比如聊天窗口的...