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++多线程编程中的生产者-消费者模型。