Web services ETL的微服务体系结构

Web services ETL的微服务体系结构,web-services,architecture,etl,microservices,restful-architecture,Web Services,Architecture,Etl,Microservices,Restful Architecture,我正在重新设计一个用Python编写的小型monolith ETL软件。我发现一个微服务架构是合适的,因为它可以让我们在需要时灵活地使用不同的技术(在我看来,Python并不是最适合企业软件的语言)。因此,如果我们有三个微服务(称为提取、转换、加载),那么将来我们可以使用Java来实现转换微服务 问题是,在这里,在API响应(比如HTTP)中传递服务调用的结果是不可行的。提取的输出将是千兆字节的数据 一个想法是调用Extract并让它将结果存储在数据库中(这实际上就是模块在monolith中所做

我正在重新设计一个用Python编写的小型monolith ETL软件。我发现一个微服务架构是合适的,因为它可以让我们在需要时灵活地使用不同的技术(在我看来,Python并不是最适合企业软件的语言)。因此,如果我们有三个微服务(称为提取、转换、加载),那么将来我们可以使用Java来实现转换微服务

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

一个想法是调用Extract并让它将结果存储在数据库中(这实际上就是模块在monolith中所做的,非常容易实现)。在这种情况下,服务将只返回是/否响应(流程是否成功)


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

这是一个有趣的问题。最好的解决方案是反应式弹簧靴。您可以将提取服务作为反应式Spring引导应用程序,而不是发送GBs数据,将数据流传输到所需的服务

现在您可能想知道,在流式处理时,它可能会保留在工作线程上。答案是否定的。它在操作系统级别工作它不会阻塞任何请求线程以流式传输结果。这就是反应式弹簧靴的魅力所在

完成此操作并探索

如果您的ETL过程对单个记录(一些可并行化的计算单元)起作用,那么您可以使用很多选项,以下是一些选项:

基于信息系统的

您可以基于消息传递系统进行处理,如。它需要仔细的设置和配置(取决于特定用例的耐久性、可用性和可伸缩性要求),但可能比关系数据库更适合您

在这种情况下,ETL步骤将完全独立地工作,只消耗一些主题,生成一些其他主题。然后,下一步等将学习这些其他主题。E/T/L步骤之间将没有直接通信(呼叫)

这是一个干净且易于理解的解决方案,具有独立的组件

现成的处理解决方案

有两种用于数据处理/计算和转换的OTS解决方案:

尽管这些解决方案显然将您局限于一种特定的技术,但它们可能比从头开始构建类似的系统要好

非持久性

如果实际数据是基于流/记录的,并且不需要在两个步骤之间持久化结果,那么只需长时间轮询上一个步骤的HTTP输出即可

您说数据太多了,但这些数据不必进入数据库(如果不需要的话),可以直接进入下一步。如果数据是在同一个本地网络上连续生成的(不是一批中的所有数据),我认为这不会是一个问题


这在技术上非常容易做到,验证和监控非常简单。

没有任何东西可以阻止您使用包含CSV的SFTP服务器或存储结果的数据库。你可以做任何有意义的事。使用消息传递千兆字节的数据,或通过HTTP进行流式传输,可能对您的情况有意义,也可能没有意义。

我建议您研究一下Apache flink,它与informatica、talend和data stage mappings等大型企业应用程序非常相似,但它的处理规模较小,但重复进行。它实际上可以帮助您计算和转换动态/到达时的内容,然后将其存储/加载到文件/db中

目前,我们使用flink process的infra每4小时接近28.5GB,它可以正常工作。在最初几天,我们必须运行每日批次和flink流,以确保两者产生一致的结果,最终大多数流保持活动状态,每日批次逐渐退出。
希望它能帮助别人

这难道不会限制我使用Java,从而破坏使用微服务架构的目的吗?我们现在甚至没有使用Java——我们将来可能会使用它,或者其他一些技术。但我希望服务接口与技术无关。不幸的是,是的。但是,让我们看看,一旦该功能在春季5日发布,我们有什么功能。我很好奇,为什么您会发现适合您的解决方案的微服务?除了灵活性之外,您还需要哪些其他非功能性功能。只有当我不能在ETL过程中使用任何其他更快的协议时,我才会使用HTTP。看看你的问题,我觉得你在寻找分布式体系结构和一个ployglot应用程序。您当前的ETL工具是桌面应用程序吗?对于基于微服务的体系结构,是否必须使用HTTP?我正在考虑其他形式的不同组件的集成,例如Amazon数据管道(基本上是按特定顺序调用服务等)或对象存储,如S3