Skip to main content

基于多线程的ETL方案

6 基于多线程的ETL方案

6.1 多线程用例用例模型

为了专注于分布式微服务设计,我们对相关的ETL的用例进行模型进行了适当的简化,下面将相关的用例模型进行说明

6.1.1用例事件

​ 下面将从对整个用例的事件序列进行描述:

1、 getter扫描临时文件夹(Temp file directory),发现新到达的网点交易文件,将新到达的网点交易文件拷贝到处理文件夹中(handle file directory)。

2,getter将新到达的网点交易文件事件信息 写入到一个待处理队列hqueue中。

3,handler 负责监控hqueue中的新文件事件到达的情况,如果有新文件事件到达,则提取相关的文件的URL信息(文件的绝对路径)。

4,handler 对网点交易文件进行处理,生成结果文件,将结果文件拷贝到装载文件目录下(load file directory)下。

5,handler将新生成的网点交易结果文件写入到一个待装载队列lqueue中。

6, loader负责监控hqueue中的新文件事件到达的情况,如果有新文件事件到达,则提取相关的文件的URL信息(文件的绝对路径),处理新到达的结果文件,将结果文件拷贝到数据库中。

7, 用例执行完毕。

6.1.2实现方案约束

在本次练习题目中,我们要求使用多进程的方案,其中三个核心组件,getter,handler,loader分布在三个不同的线程之间, 三大核心组件不能直接调用,而必须通过queue来进行信息的交互。

设计的约束见下图所显示:

6 multi-thread

6.2 多进程设计模型

52 multiprocess model

​ 图 6-1 多线程的设计模型

从上图可见,多线程的设计模型和多进程的设计模型基本接近。

6.2.1组件设计方案

5-1 multi-thread

​ 图 6-2 多进程的设计方案

从上图可见,以上在多线程的情况下,不同的线程之间的通信方案。

1, 独立进程: 在本方案中,将getter,handler,loader中在不同的线程中启动。线程之间不直接通信。

2,本方案中,使用了两个queue。 实现getter与handler;以及handler和loader之间的异步消息通信。这两个queue也是线程级别的queue。

6.2.2 多线程之间的空间

6-1 multi-thread space

​ 图 6-3 多线程的空间

在多线程的情况下,多个计算组件都存在于一个进程空间中,但是分别属于不同的线程之中。

6.3线程间通信

在多线程中,不同的线程使用queue来进行通信。

相关的配置语句为

from queue import Queue

在这种情况下,使用的是语言内置的queue来实现的。仅仅可以实现进程内部的通信。

6.4 总结

6.4.1 两种方案的对比

从编码的角度,多进程和多线程的编码基本类似,主要的区别在于:

1, 多进程方案可以更好的利用多CPU的特性,如果部分组件是高度依赖CPU的应用,那么使用多进程方案比较合适。

2,多线程方案中是在1个CPU的环境中运行,如果部分组件是高度消耗IO的应用,那么使用多线程方案比较合适。

3,两种方案都要用到queue, 但是来自不同的组件。其中进程间的通信,需要利用多进程包中的queue,而线程间通信则利用及基本包中的queue。

6.4.2异步协同方案

基于queue的方案,无论是多进程,还是多线程,都可以很好的实现异步的协同处理方案。进而实现一种生成者和消费者的编程模式。

6-3 消费队列

Starter
MicroServ
Tutorials
Blog