让我们想象一下,我们的应用程序需要从关系数据库到另一个关系数据库的ETL(提取,转换,加载)数据。 最简单(和大多数性能,恕我直言)的方式是在数据库之间建立链接并编写简单的存储过程。在这种情况下,我们使用最少的技术和组件,所有功能都是开箱即用的"。
但这是SOA(面向服务的架构)的良好实践吗?紧耦合怎么样?我们是否永远将数据库强烈地相互耦合?
还有另一种方法:我们在每一侧构建2个Java应用程序,并通过SOAP Web服务进行通信。这更加SOA友好!但是性能下降和额外的失败点值得吗?
在这种情况下,最佳做法是什么? ETL如何适应SOA?
答案 0 :(得分:3)
在SOA中,您可以调整Biztalk或SAP BusinessObjects Data Integrator处理方式。基本上,它是一个调度程序作业/ Windows服务,或类似的东西。您提供两个服务点,1表示调度程序检索数据,另一个表示调度程序发送数据。调度程序的责任就是定期运行并转换数据。
所以,基本步骤将是:
步骤1:调度程序运行并从服务A获取数据
Scheduler --get--> Service A
Service A --data--> Scheduler
步骤2:进行数据转换的调度程序
[ Conversion --> Conversion --> Conversion --> Conversion ]
步骤3:调度程序将数据发送到另一个服务
Scheduler --data--> Service B
在Biztalk和SAP BusinessObject Data Integrator中,这些步骤都是可配置的(它们可以从任何服务中检索并可以进行脚本数据转换),因此它更灵活。
但是,ETL处理仍然会出现常见问题。例如:数据太大,网络性能影响,RTO,重复数据等。因此,ETL最佳实践仍然是一个要求(使用登台表,日志记录等)。
但性能下降和其他失败点 值得吗?
性能影响将发生,因为现在您有额外的连接/身份验证步骤(到webservice)和传输步骤(通过协议的webservice到调度程序)。但是对于容易出错的问题,我认为这与您需要处理其他服务调用的错误相同。
值得吗?这取决于。如果您在相同的环境(相同的数据库)中工作,那么它是值得商榷的。如果您在不同的环境中工作(例如,两个不同的系统,从Asp.Net到SAP,或者至少是不同的数据库实例),那么这种架构是处理ETL的最佳选择。
答案 1 :(得分:2)
ETL通常适用于SOA - 例如SOA服务可以在彼此之间执行ETL操作。
当您要复制数据库或其他类似情况时,数据库到数据库的链接非常有用。一般来说,这种方法与SOA无关,除非存在以下情况。
当这两个这些数据库被SOA服务使用时,数据库到数据库的链接不适合SOA。在这种情况下,您应该通过服务进行沟通。当只有一个数据库是SOA服务的持久性时,数据库到数据库的链接仍适用于SOA。另一个可以被视为故障转移或简单复制,与SOA没有直接关系。在这种情况下,数据库到数据库的链接只会成为与数据相关的问题,您可以拥有并解决这些问题。
答案 2 :(得分:1)
对我来说,db-to-db 和基于Rest的设置中缺少几点:
etl过程中的例外情况:
什么时候认为数据转换是有效的?
如何处理不成功的转换结果?在大多数情况下,只是抛弃数据不是一种选择
系统故障/恢复
如果一个/两个系统停机一段时间怎么办?如何处理同步?
什么时候etl失败了,哪里必须重新启动?
因此,与使用数据库或休息服务进行交流时,这与使用迁移技术(如Apache Camel)或使用可以处理转换,拆分数据,异步处理,将其重新组合在一起的ESB更相关。适当的监控,恢复,负载平衡以进行性能优化。这不会加速etl中的'E',也不会加速'L'(尽管它可能同时加速),但肯定会加速'T'并且具有数据完整性的正面结果。
当然:ESB是与SOA相关的技术。 Apache Camel对我来说并不是真的,虽然它被认为是企业集成模式的参考实现
基本上,它背后的想法是etl是基于内容而不是基于结构的问题。
那么你可以用这些技术做些什么呢?
DB< - DataExtractor - 验证器
- ContentLengthBasedRouter - Splitter
(Ansynch)
- 变压器1,
- 变压器2 ..
- 聚合器 -
- ContentBasedRouter - Transformer3 -
- DataInserter
- 监控器
以及更多,但这不适合文本描述。
答案 3 :(得分:0)
所有这些答案都很好,也很有帮助。
正如我现在所理解的,SOA不是关于实现应用程序,而是关于架构(“A”),主要是企业架构。企业主要管理方法是服务责任委托(“S”)。
因此,如果企业结构中有两个不同的业务功能,并且有两个不同的负责账户,我们应该将它划分为两个不同的服务,具有明确定义的合同(接口),政治和审计方法 - 这是SOA的主要目的。 / p>
但如果它是一个负责人的原子功能,那么SOA就没那么需要了,我们应该使用简单的技术并实现简单快速的可靠服务应用。
关于我原来的问题,缺少任务上下文信息。 现在我明白数据库链接不应该跨服务实现,而且设计不好因为没有企业管理兼容性。 但在服务中,它可能是一个很好的简单解决方案。
感谢大家的回答。