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

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

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

郭金磊,张玉生,胡爱兰

(华北计算机系统工程研究所,北京 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.

相关推荐

DIY桌面激光雕刻机#是时候展现真正的技术了

激光雕刻机。这期视频我们来看一下我是如何DIY一台桌面激光雕刻机。前几天在水池子边上发现了一台旧电脑,我看这电脑上还有一些东西可以利用到,比如光驱上面拆出了步进电机和滑轨。所以本期视频我将用这些废品去...

100000块多米诺骨牌拼成超级马里奥,这款机器人1天就完成了

智东西(公众号:zhidxcom)编译|王健恩编辑|高歌智东西7月30日消息,美国工程师兼YouTube博主MarkRober创造出了一个可以自动摆放多米诺骨牌的机器人。这个机器人被命名为D...

这个3D打印机器人可以在30秒内打开密码锁

密码锁看似很安全?也许曾经是,但现在你可要当心了!这是因为一台3D打印制造的机器人就可以在半分钟内打开你的密码锁。上周四,知名黑客萨米·卡姆卡尔(SamyKamkar)在自己的网站上公布了一个称之为...

密码锁也不安全 这款机器人30秒即可自动打开

大学生和体育爱好者们要注意了,千万不要再把贵重物品存放在公共储物柜里。因为现在已经出现了一种3D打印的机器人,据说世界上各大锁商推出的大部分密码锁,它都能够在30秒之内打开。著名黑客山米·卡姆卡(Sa...

硬件单片机模拟器,再也不用买开发板了...

#头条创作挑战赛#记得2006年在凌阳科技(sunplus)工作的时候,凌阳科技开发了自己的编译器/集成开发环境(unspIDE),那个IDE除了有keil那样的编辑器、编译器、链接器、调试器、下载...

3D打印机分哪几部分构成?(3d打印机结构组成及系统分析)

3D打印机的构成根据技术类型(如FDM、SLA、SLS等)有所不同,但以最常见的FDM(熔融沉积成型)3D打印机为例,其核心组成部分可分为以下模块:1.机械结构框架提供整体支撑和稳定性,常见材质为金...

初学者学伺服都需要什么?石家庄诺仕通

#初学者学伺服都需要什么?#对于初学者学习伺服系统,需要从...

arduino(arduino是单片机吗)

arduino学习笔记arduino学习笔记1-什么是arduino?...

自制写字机,你需要的全套资料都在这里

小编之前发过《用废旧光驱制作迷你绘图仪》,很多读者都成功制作了自己的绘图仪。但是该方法的缺点是gcode要在inkscape软件中生成,然后通过grbl-controller这个没有界面的程序发送画图...

自己动手DIY3D打印机 瞬间效果出现桌面时,大家都惊呆了!

3D打印机,对数码产品比较了解的朋友都知道,但是真正玩过的童鞋可能就不多了。其实3D打印机离我们并不远,随着3D打印技术越来越成熟,3D打印机的学习资料也越来越多,这让自己动手做一台桌面3D打印机也成...

机器人仅用24小时将十万块多米诺骨牌拼出马里奥,创下世界纪录

十万块多米诺骨牌倒下是个啥场面?等等,十万块?那得搭多久啊?...

如何制作一个机器人?(制作机器人的方法)

1.简单机械机器人(例如自动小车)2.智能机器人(带有人工智能或计算机视觉)3.工业机器人(用于生产自动化)4.人形机器人(类人结构,可以行走、对话)...

CrowPi2树莓派4学习套件评测第1部分–开箱和首次启动

文章来源:CNXSoftware中文站2020年6月,我曾写过一篇关于深圳易科诺...

基于 Arduino UNO 的蓝牙汽车(arduino智能小车蓝牙控制app)

HC-05蓝牙模块HC-05是一款易于使用的蓝牙SPP模块,针对流畅的串行无线通信配置进行了优化。串口蓝牙模块是完全合格的蓝牙V2.0+EDR(增强数据速率)3Mbps调制,具有总2.4...

电机驱动设计方案带你初识机电一体化

在直流电机驱动电路的设计中,主要考虑以下几点:功能:电机是单向还是双向转动?需不需要调速?...