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

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

本文目录:

一、文件传输高可用架构

二、传输会话的控制

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

四、总结

一、文件传输高可用架构

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

  • BFT Server(中心服务节点):集中管理传输代理节点信息、传输配置信息、日志记录等。
  • BFT Console(管理控制台):基于BFT Server提供的HTTP接口,为用户提供友好的交互界面,使用Web化的控制台管理整个文件传输系统。
  • BFT Agent(传输代理节点):大文件传输任务的执行单元,Agent部署在一台独立服务器上运行,监控指定的本地文件系统,它可以发送和接受来自Agent或者其他文件数据源的文件。

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

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

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

二、传输会话的控制

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

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

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

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

1、分段传输

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

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

2、数据校验

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

3、断点续传

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

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

4、消息优化

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

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

5、流速控制

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

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

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

问题:

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

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

解决方式:

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

· 定时采集流速信息

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

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

6、传输安全

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

四、总结

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

关于作者:

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

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

原文发布于微信公众号 - EAWorld(eaworld)

原文发表时间:2017-04-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏顶级程序员

千万千万不要运行的 Linux 命令

来源:Linux 中国 https://linux.cn/article-401-1.html 文中列出的命令绝对不可以运行,即使你觉得很好奇也不行,除非你是...

3648
来自专栏程序猿DD

数据异构的武器:BINLOG+MQ

作者:新栋BOOK 原文:https://my.oschina.net/wangxindong/blog/1531596 摘要: 分库分表中有一个最为常见的场景...

4747
来自专栏小怪聊职场

爬虫课程(十三)|ajax分析法(雪球),通过获取api并破解api的反爬策略爬取数据

4429
来自专栏京东技术

【实例分享】Mock框架的三次迭代,让你的单元测试更高效

对于单元测试中的单元,不同的人有不同的看法:可以理解为一个方法,可以理解为一个完整的接口实现,也可以理解为一个完整的功能模块或者是多个功能模块的一个耦合。

1750
来自专栏携程技术中心

RN沙龙 | 携程是如何做React Native优化的

赵辛贵,携程无线开发高级技术经理,目前主要负责React Native框架在携程内部的使用推广和性能优化 React Native(下文简称RN)开源已经一年...

8719
来自专栏IT大咖说

移动端SDK优化的特点与经验分享

摘要 结合极光的业务和自身开发经验,极光高级Android工程师为我们简单介绍移动SDK与APP的区别,以及在做架构设计、性能优化上的一些经验。 ? SDK和A...

3676
来自专栏企鹅号快讯

千万千万不要运行的 Linux 命令

来源:Linux 中国 https://linux.cn/article-401-1.html 文中列出的命令绝对不可以运行,即使你觉得很好奇也不行,除非你是在...

3957
来自专栏大史住在大前端

webpack4.0各个击破(10)—— Integration篇

webpack在工具链中的角色定位是非常清晰的,那么为了与其他流程进行合作,就需要使用任务管理工具来启动webpack,本文介绍两种常见的方法。

1013
来自专栏王清培的专栏

后端服务性能压测实践

后端服务性能压测实践 标签(空格分隔): 性能 压测 后端服务 压测实践 作者:王清培(Plen wang) 背景 环境检测 压力机及压力工具检测 Linux...

7929
来自专栏微信终端开发团队的专栏

微信终端跨平台组件 mars 系列(一):高性能日志模块xlog

mars 是微信官方的终端基础组件,是一个使用 C++ 编写的业务性无关,平台性无关的基础组件。本文章是 mars 系列的第一篇:高性能跨平台日志模块。

5850

扫码关注云+社区

领取腾讯云代金券