用于通过彼此非周期性依赖的模块运行数据记录的数据管道

时间:2019-08-29 08:45:27

标签: database data-structures architecture pipeline data-processing

我的问题围绕着通过多个模块处理数据的最佳实践,其中每个模块根据原始数据或其他模块生成的数据创建新数据。让我创建一个说明性的示例,在该示例中,我将考虑一个MongoDB文档和为该文档创建更新参数的模块。考虑一个基础文档{"a":2}。现在,考虑以下这些模块,这些模块已作为Python函数编写:

def mod1(data):
    a = data["a"]
    b = 2 * a
    return {"$set":{"b":b}}

def mod2(data):
    b = data["b"]
    c = "Good" if b > 1 else "Bad"
    return {"$set":{"c":c}}

def mod3(data):
    a = data["a"]
    d = a - 3
    return {"$set":{"d":d}}

def mod4(data):
    c = data["c"]
    d = data["d"]
    e = d if c == "Good" else 0
    return {"$set":{"e":e}}

以正确的顺序应用时,更新的文档将为{"a":2,"b":4,"c":"Good","d":-1,"e":-1}。请注意,mod1mod3可以同时运行,而mod4必须等待mod2mod3在文档上运行。我的问题比较笼统。做这样的事情的最好方法是什么?我当前的方法与此非常相似,但是由于每个模块的处理性较差,因此每个模块都有自己的Docker容器。这样做的问题是,它要求每个模块都在查询这些文档连续驻留的整个集合,以查看文档是否有效以供处理。

1 个答案:

答案 0 :(得分:0)

您真的想要针对此类管道的事件驱动架构。随着记录的更新,将事件推送到主题队列(或ESB)上,并使其他管道监听这些队列。在事件发布后,其他管道阶段可以获取记录并处理其阶段。