淘宝DataX 数据交换机制学习总结

来源:互联网 发布:乌克兰的军事实力 知乎 编辑:程序博客网 时间:2024/06/18 17:47

DataX是淘宝的数据同步工具,工作流程大概就是用Reader模块从源数据库读数据,在Storage模块里将Reader模块读到的数据交换给Write模块,Write模块将数据写进目的数据库。

整套工具是JAVA开发的。C++出身的对JAVA语法细节不熟悉,结合网络资料和项目源码注释,梳理一下Storage模块的逻辑流程。


DoubleQueue:

设立两块空间,一个存储源数据,一个存储目标数据。在开始,空间A和空间B都是空的,loading 任务从源数据库向A空间加载数据,A空间满后再向B空间加载数据,同时dumping任务将A空间数据转储到目的数据库。A空间清空后,交换AB两者的任务,即A空间的任务换成loading,B空间的任务换成dumping。不断重复上述操作。

RAMStorage:

基于DoubleQueue,用内存作为数据交换的空间

基于RAMStorage的数据操纵接口:LineSender和LineReceiver

LineSender的作用:Reader用LineSender来放数据到Storage对象中。

在LineSender接口里,主要有这几个接口:

createLine():构造一个将要被用来交换数据的Line对象

sendToWriter(Line line): 用来将一个Line对象put到Storage抽象类里。

flush()用来将buffer的数据flush到Storage对象中。

LineReceiver的作用:Writer用LineReceiver来从到Storage对象中获取数据。

在LineReceiver接口里,主要有一个接口:

getFromReader():获取下一个Storage中的Line对象。


基于RAMStorage的批量数据交换:BufferedLineExchanger

内部初始化一个指定大小的数组缓冲,默认大小64 

在push数据时会先写满64个数组再单次写入DoubleQueue队列,Poll时返回的大小可能会小于64个单位,由当时数组的实际大小决定。


其它:

数据读写用到了多线程并发。看JAVA源码比较吃力,猜测Reader/Writer线程和DoubleQueue之间应该类似于C++多线程编程中的生产者-消费者模型。






 

2 0
原创粉丝点击