ETL的微服务架构

时间:2017-07-12 01:48:20

标签: web-services architecture etl microservices restful-architecture

我正在重新设计一个用Python编写的小型整体ETL软件。我找到了一个适合的微服务架构,因为它可以让我们在需要时灵活地使用不同的技术(在我看来,Python不是企业软件最好的语言)。因此,如果我们有三个微服务(称为Extract,Transform,Load),我们将来可以使用Java for Transform微服务。

问题是,这里在API响应(比如HTTP)中传递服务调用的结果是不可行的。 Extract的输出将是千兆字节的数据。

一个想法是调用Extract并将结果存储在数据库中(这实际上是该模块在整体中所做的事情,因此很容易实现)。在这种情况下,服务将仅返回是/否响应(过程是否成功)。

我想知道是否有更好的方法来解决这个问题。什么是更好的架构?我提出的是合理的吗?

4 个答案:

答案 0 :(得分:2)

这是一个有趣的问题。对此最好的解决方案可能是 Reactive Spring Boot 。您可以将Extract服务作为Reactive Spring Boot应用程序,而不是发送GB数据,将数据流式传输到所需服务。

现在你可能想知道,在流式传输时,它可能会保留在工作线程上。答案是不。 IT在OS级别工作。 它不会阻止任何请求线程来传输结果。这就是Reactive Spring Boot的魅力所在。

仔细阅读并探讨 https://spring.io/blog/2016/07/28/reactive-programming-with-spring-5-0-m1

答案 1 :(得分:1)

如果你的ETL过程适用于个别记录(一些可并行化的计算单位),那么你可以选择很多选项,这里有几个:

基于消息系统

您可以围绕邮件系统进行处理,例如Apache Kafka。它需要仔细设置和配置(取决于特定用例的持久性,可用性和可伸缩性要求),但可能比关系数据库更适合您。

在这种情况下,ETL步骤将完全独立地工作,只是消耗一些主题,产生一些其他主题。然后,下一步等将选择那些其他主题.E / T / L步骤之间不会有直接的通信(呼叫)。

这是一个简洁易懂的解决方案,具有独立的组件。

现成的处理解决方案

有几种用于数据处理/计算和转换的OTS解决方案:Apache FlinkApache StormApache Spark

虽然这些解决方案显然会限制您使用某种特定技术,但它们可能比从头构建类似系统更好。

<强>非持久

如果实际数据是基于流/基于记录的,并且不需要在步骤之间保持结果,那么您可以远程轮询上一步的HTTP输出。

你说这只是太多的数据,但是这些数据不必转到数据库(如果不需要),而只能转到下一步。如果数据是连续生成的(不是一批中的所有数据),在同一个本地网络上,我不认为这是一个问题。

这在技术上非常容易实现,非常简单,无法验证和监控。

答案 2 :(得分:1)

没有阻止您拥有包含CSV或存储结果的数据库的SFTP服务器。你可以做任何有意义的事情。使用消息传递来传递千兆字节的数据,或通过HTTP传输可能会或可能不会为您的案例提供感官。

答案 3 :(得分:1)

我建议您看一下Apache flink,它与大型企业级应用程序(如informatica,talend和数据阶段映射)非常相似,但处理规模较小,但需要重复进行。实际上,它可以帮助您动态地计算和转换内容(当它们到达时,然后将其存储/加载到文件/ db中)。

我们当前使用flink进程处理的基础设施每4小时关闭28.5GB,并且可以正常工作。在开始的几天里,我们必须运行每日批处理和flink流,以确保两者均产生一致的结果,最终大多数流保持活动状态,并且逐渐淘汰了每日批处理。 希望它可以帮助某人。