ETL(数据库到数据库)如何适应 SOA?

How does ETL (database to database) fit into SOA?

让我们想象一下,我们的应用程序需要从关系数据库到另一个关系数据库的 ETL(提取、转换、加载)数据。 最简单(也是最高效,恕我直言)的方法是在数据库之间创建 link 并编写简单的存储过程。在这种情况下,我们使用最少的技术和组件,所有功能都是 "out of the box".

但这对 SOA(面向服务的架构)来说是好的做法吗?紧耦合呢?我们是否永远将数据库彼此紧密耦合?

还有另一种方法:我们在每一侧构建 2 个 java 应用程序,并通过 SOAP Web 服务进行通信。这对 SOA 更友好!但是性能下降和额外的故障点值得吗?

在这种情况下,最佳做法是什么? ETL 如何适应 SOA?

在 SOA 中,您可以采用 Biztalk or SAP BusinessObjects Data Integrator 处理方式。基本上,它是一个调度程序作业/windows 服务,或类似的东西。您提供两个服务点,一个供调度程序检索数据,另一个供调度程序发送数据。这里调度器的职责只是运行周期性地转换数据。

所以,基本步骤是:

第 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 最佳实践仍然是这里的要求(使用暂存 table、日志记录等)。

But are the performance degradation and additional points of failure worth it?

性能影响将会发生,因为现在您有额外的 connection/authentication 步骤(到 web 服务)和传输步骤(通过协议从 web 服务到调度程序)。但是对于容易出错的问题,我认为这与您需要处理其他服务调用的错误相同。

值得吗?这取决于。如果您在相同的环境(相同的数据库)中工作,那么它就是 debatable。如果您在不同的环境中工作(例如,两个不同的系统,从 Asp.Net 到 SAP,或至少不同的数据库实例),那么此架构是处理 ETL 的最佳选择。

ETL 通常适用于 SOA - 例如SOA 服务可以在彼此之间执行 ETL 操作。

当您想复制数据库或其他类似情况时,数据库到数据库的链接非常有用。一般情况下,这种方法与SOA无关,除非存在以下情况。

两个这些数据库都被 SOA 服务使用时,数据库到数据库的链接不适合 SOA。在这种情况下,您应该通过服务进行通信。

当只有一个数据库是 SOA 服务的持久性时,数据库到数据库的链接仍然适用于 SOA。另一个可以认为是故障转移或简单复制,与 SOA 没有直接关系。在这种情况下,数据库到数据库的链接就变成了一个与数据相关的问题,你可以拥有并解决它。

对我来说,db - to - db 基于 Rest 的设置中缺少几点: etl 过程异常:

什么时候数据转换被认为是有效的?
如何处理转换失败的结果?
在大多数情况下,仅仅丢弃数据并不是一种选择。
系统故障/正在恢复
如果一个/两个系统暂时停机怎么办?如何处理同步? etl 何时失败以及必须在何处重新启动?

因此,不必使用数据库或其他服务 - 恕我直言,这与使用 Apache Camel 等迁移技术或使用可以处理转换、拆分数据、异步处理、将其放回一起、拥有一个适当的监控、恢复、负载平衡以优化性能。这不一定会加速 etl 中的 'E',也不会加速 'L'(尽管两者都可能),但肯定会加速 'T' 并且对数据完整性有积极的影响。
当然:ESB 是与 SOA 相关的技术。 Apache Camel 对我来说并不是真的,尽管它被认为是企业集成模式的参考实现。

基本上它背后的想法是 etl 是基于内容而不是基于结构的问题。
所以你可以用这些技术做的是:
DB <- DataExtractor - 验证器
- ContentLengthBasedRouter - 拆分器
(同步) - 变形金刚 1,
- 变形金刚 2 ..
- 聚合器 -
- ContentBasedRouter - Transformer3 -
- 数据插入器
- 监控
还有更多,但不适合文字描述。

所有这些答案都很好,很有帮助。

据我所知,SOA 不是实现应用程序,而是架构 ("A"),主要是企业架构。企业主要的管理方式是委托服务("S")。

因此,如果企业结构中有两个不同的业务功能,有两个不同的责任账户,我们应该将其划分为两个不同的服务,具有明确定义的契约(接口)、策略和审计方法——这就是 SOA 的主要目的.

但如果是一个原子功能,一个人负责,SOA就没必要那么多了,应该用简单的技术,实现简单快速的实体服务应用。

关于我原来的问题,是缺少任务上下文信息。 现在我明白了数据库链接不应该跨服务实现,它是糟糕的设计,因为它没有企业管理兼容性。 但在服务中,它可能是很好的简单解决方案。

谢谢大家的回答。