解密普元大文件传输核心技术

转载本文需注明出处:微信公众号EAWorld,违者必究。


提起文件数据的传输功能,文件如何传输,如何保障传输的可靠性,不会出现数据错乱等问题是客户最为关心的问题。普元作为国内领先的软件基础平台与解决方案提供商,在这篇文章里,我将会和大家从架构和技术两个方面解密我所在职的这家公司产品家族中的大文件传输技术。

本文目录:

一、文件传输高可用架构

二、传输会话的控制

三、如何保障文件传输安全可靠

四、总结



一、文件传输高可用架构

大文件传输采用分布式的架构,它包括了三个重要的组成部分:BFT Agent,BFT Server,BFT Console。


  • BFT Server(中心服务节点):集中管理传输代理节点信息、传输配置信息、日志记录等。

  • BFT Console(管理控制台):基于BFT Server提供的HTTP接口,为用户提供友好的交互界面,使用Web化的控制台管理整个文件传输系统。

  • BFT Agent(传输代理节点):大文件传输任务的执行单元,Agent部署在一台独立服务器上运行,监控指定的本地文件系统,它可以发送和接受来自Agent或者其他文件数据源的文件。


文件传输系统的各个组件分布在不同的物理设备之上,通过TCP连接进行交互通讯。作为整个系统的首脑BFT Server就存在单点故障的隐患,例如网络故障、设备故障的,这都造成BFTServer无法正常服务,随之而来的就是整个系统立刻停滞无法正常工作。

0?wx_fmt=png


为了达到可用性,BFTServer可以部署多个,BFTAgent与其中一个BFTServer进行通讯,如果其中一个连接无法重建,就可以选择使用另外一个可用的BFTServer进行连接。文件传输系统针对性较强,为了达到多个BFTServer之间数据的一致性,将少量用于共享的数据存储在Key-Value数据库中,减少BFTServer之间复制,达到数据一致性。

0?wx_fmt=png

BFTServer也针对不同的业务数据进行合理规划设计,减小锁粒度或者降低竞争带来的开销,例如BFTAgent在线状态,针对每个Agent配置一个分布式锁,更新在线状态必须获得Agent对应的锁。而对于文件传输记录这样的无状态数据无论在哪一个BFTServer都可以进行持久化存储在同一个数据库中。


二、传输会话的控制

0?wx_fmt=jpeg

文件传输的传输过程是通过TCP连接,建立文件传输会话,在一次会话当中完成一个文件的传输。

传输会话中存在两类角色,其中发现文件的Agent作为发送方,接受文件的另外一个Agent就是接收方。发送方首先会与接收方进行协商,建立一个用于传输的会话连接,会话建立成功之后,发送方把发现的文件一段一段的切分,切分的每一个数据段在建立好的会话上发送到消费方,消费方接受数据并验证,验证通过之后存储到本地,当接收方接受完成整个文件之后会发送一个回执到发送方,通知发送方文件已经完整无误的接受完成,可以进行后续处理。

由于依赖于网络进行数据传输,大文件传输采取了很多措施来保障文件可以正确无误的传输到目的地,下面为大家一一介绍。


三、如何保障文件传输安全可靠


1、分段传输

0?wx_fmt=jpeg

由于传输依赖于网络,容易受到网络质量的影响,例如一个1T左右的文件在一个不太稳定的网络中传输,在传输过程中出错频率高,需要具备纠错能力,保证文件完整性。如果一个文件没有采用一个有序的策略去处理,那么大文件可能无法准确无误的到达,所以需要把文件切分成数据段这样更小的单元,通过消息通讯机制进行发送的。这种方式可以控制文件的发送接收、文件完整性的校验等等一系列控制操作。


一个文件被切分为众多数据段,每个数据段分配一个文件的块号,通过块号可以准确无误写入到接收方的临时文件当中。当最后一个文件块到达接收方并写入文件成功之后,更改临时文件名,同时向发送方返回一个确认消息,通知发送方,所有文件块已经接收完成,发送方可以进行下一步操作。在传输的过程中,每个数据段可以进行例如校验、加密、多线程I/O等。


2、数据校验

0?wx_fmt=jpeg

如果说数据在传输过程中产生错误,错误的数据没有被发现,那么接收到的文件也就无法保障正确性。分段方式传输则可以定位和发现错误,保障文件内容的完整无误。文件传输在读取文件时,对已经读取的数据段进行编号并计算校验和,校验和、编号和数据段一同发送到接收方。当接收方接受完成之后校验,如果验证错误则立刻发送消息到发送方,发送方接收到这个信号之后会从出现问题的编号位置重新读取数据,并将I/O队列清空。


3、断点续传

0?wx_fmt=png

大文件传输具备从断点位置重新传输的能力,而分段式的传输为断点定位定和续传带来便利。例如文件发送第N块数据时,连接被断开或者会话异常,之后恢复连接和会话重试之后,发送方可以从上次中断的文件块开始继续传输,不需要重新开始。


因为网络和应用层面存在数据缓冲区,所以文件传输的断点是按照接收方存储到文件系统中的实际大小为准,在建立传输会话时由接收方提供给发送方,这样发送方就能准确定位断点。


4、消息优化

0?wx_fmt=jpeg

文件被分段传输,每个数据段都是在一个个消息上,使用Java对象作为消息进行通讯,由于消息中携带有类型的元数据,码流过大,效率较低,所以大文件传输利用Google Protobuf编解码方案与BFT自定义编解码两种方式混合使用,提高消息的利用率降低码流,以尽可能少的控制数据与文件数据放置在一个消息当中。


其中Protobuf主要负责非文件数据的复杂消息的交互,例如建立会话的请求、回执消息等等。对于文件切分出来的数据块,则采用更为简洁直观的自定义编解码方式。文件数据消息使用特殊BFT自定义消息的主要原因:Protobuf没有NIO接口。如果使用Protobuf只能产生byte[],这样会出现内存复制和GC过程


5、流速控制


文件传输在实际传输文件的过程中,尤其是大文件,会占用设备带宽资源,影响其它进程的使用,所以文件传输BFTAgent具备实时流控,可以在BFTAgent进程和多个文件传输配置两个维度分配流量,降低对其它进程的影响。流控同时带来另外一个应用场景,那就是优先级。可以针对优先级高的文件,增加流出速率,让高优先级的文件传输的更快一些。


文件传输的带宽设置主要分为两部分,其中BFTAgent设置一个总的可用带宽,BFTAgent所属的文件传输服务从这个总带宽中分配。


由于Java无法直接获取系统底层的网络控制权,流速控制是如何实现呢。大文件传输采用了缓冲队列和定期采集I/O流速的方式实现带宽控制,缓冲队列具备最高水位线,限制可以存储的待发数据,防止内存溢出,当到达控制阈值后,缓冲队列超过最高水位线时,发送不可写事件,通知发送逻辑暂停读取文件,等待恢复至水位线以下或任务被取消。概括如下,


问题:

·        文件较大,传输占用带宽资源,影响其他应用

·        需要对不同的文件采用不同的传输优先级


解决方式:

·        缓冲队列存放待发送数据

·        定时采集流速信息

·        超过流速产生文件读取暂停事件

·        流速下降之后恢复文件读取


6、传输安全

0?wx_fmt=jpeg

对于传输过程中数据的安全性,文件传输系统支持安全套接字协议。为了满足企业更多的定制化安全策略,同时也提供文件数据的加密、解密接口,可由用户自行实现并放置到系统中,让数据的传输更加安全。这两种方式可以组合使用。


四、总结

从揭秘普元大文件传输的核心可以看出,在高可用的分布式架构中,每个传输节点基于TCP会话把文件切分为数据段进行传输、校验、压缩、断点续传操作,降低了网络等因素的影响,提高了数据传输效率,这些就是保障大文件传输高可用、传输过程可靠的秘密所在。


如需成为EAii架构研究院会员加入微信群参与架构设计与讨论直播,享受微课堂PPT抢先下载等权益,请发送您的微信号至此公众号eaworld。


关于作者:

杨波 普元大数据产品线研发核心架构师

2014年加入普元,现主要从事普元产品ESB、DI、BFT的研发与维护工作 ,对网络和并发编程有浓厚兴趣。


关于EAWorld

微服务,DevOps,元数据,企业架构原创技术分享EAii(Enterprise Architecture Innovation Institute)企业架构创新研究院旗下官方微信公众号。


微信号:eaworld,长按二维码关注

0?wx_fmt=jpeg


当微服务撞上区块链》系列微课分为《区块链的业务价值是通过数据共享降低信任成本》、《区块链的技术核心是分布式数据库》、《区块链与微服务是天生的一对》三个主题,最新一期播出时间为4月12日(本周三),敬请期待!

0?wx_fmt=jpeg


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值