我正在构建一个管道,用于在实体上刮取数据,为了保持通用,我们称它们为Widgets。有关小部件的数据目前是无组织的,并且分布在各种来源,包括源代码、电子表格和发布/项目跟踪软件(如JIRA )。管道将在某些时间运行,并定期更新小部件上的数据表。
我设计了这条管道,把它分成几个小的单独测试的阶段。这些阶段是连接在一起的,它们所抓取/查询的数据最终被连接在一起。例如,类似于:
如你所知,各个阶段是相互依赖的。我这样做是为了避免一个需要重新抓取/处理已经被前一阶段处理过的数据的阶段(例如,阶段B不需要重新刮取数据A,而是对数据A进行操作)。
目前主要的开放设计问题使我无法入睡。E阶段。我反复讨论了如何将最终完成的Widget数据反映出不同来源的数据A、B、C、D的现有结构。另外。在创建Widget数据之前,E阶段应该完成多少处理/转换(如果有的话)?举个简单的例子,如果数据A和数据B中存在与标识相关的信息,那么我的Widget模式应该有一个由A和B中的数据组成的identification字段,还是应该同时包含identification信息的A和B字段。换言之:
Widget {
A a {
string id
}
B b {
string name
}
}优点:
Widget数据。Widget {
Identification identification {
string id
string name
}
}优点:
我很好奇SE专家对这个整体架构的看法和上面的问题。我猜答案将是“这取决于”,但我对上述方法至少有更多的利弊感兴趣。任何学习资源的链接也是非常感谢的!
发布于 2021-03-11 07:40:57
我会提出一个稍微不同的架构,这也将避免意外地暴露数据处理的管道性质。
有两个数据结构
管道步骤将被这样修改。
由于每个阶段都在中间Widget数据上工作,所以哪个阶段提供哪些数据就变得不那么重要了,以后更容易添加一个新的附加阶段。例如,阶段之间仍然存在依赖关系,因为阶段D需要先前填充的数据,但是阶段D的实现不需要知道特定于阶段的数据结构才能检索它需要的数据。
在构建管道的时候,您需要知道每个阶段需要什么,并提供什么,以便您能够以正确的顺序构造它。
这样做的好处是,您可以在不影响下游阶段的情况下拆分或重新排列管道中的各个阶段。例如,如果您发现阶段B和C所做的某些工作实际上是重复的(但结果是填充了不同的字段),则可以将重复的工作重构到一个新的阶段BC和阶段D(该阶段使用由重复工作填充的字段之一)不会受到任何影响。
https://softwareengineering.stackexchange.com/questions/423222
复制相似问题