跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 用 golang 的做一个 pipeline | ETL 问题有什么好的设计?
未分類
18 4 月 2021

用 golang 的做一个 pipeline | ETL 问题有什么好的设计?

用 golang 的做一个 pipeline | ETL 问题有什么好的设计?

資深大佬 : yellowmarlboro 1

有 N 个数据源,根据这 N 个数据源计算出 M 个结果,依赖关系简单如下,实际会略微复杂些,但一定是个有向无环图。 结果也有有可能会当成另外一个结果的'数据源'      A     B    /    /   /    /  R1    R2     C             /            /            R3  
有一些问题
  • 其他调用方会来调用我服务,调用的输入为字符串比如{“R2”, “R3”}。
  • 每次要计算的结果的数量是不确定的,其他调用方可能只要 R1 和 R2,那我就不想去调用 C 数据源了。
  • 每个来调用接口的独立请求里,我这里的数据源我只想调用一次,比如我不想算 R1,R2 的时候获取两次 A 数据源,以及如果在算过 R2 之后,再去算 R3 的时候要再算一边 R2 。
  • 我想从下往上算,比如 R3 的逻辑里里 go 出去 R2 和 C,R2 里再 go 出去 A 和 B,那我后续算 R1 的时候,怎么直接取刚刚算 R2 时的获取过的 A,A 写成单例?只要被调用后,再次被调用返回数据源? -当然还有其他的,比如错误中断之类。
大佬有話說 (2)

  • 資深大佬 : dayeye2006199

    > 其他调用方会来调用我服务,调用的输入为字符串比如{“R2”, “R3”}。
    > 每次要计算的结果的数量是不确定的,其他调用方可能只要 R1 和 R2,那我就不想去调用 C 数据源了。

    这个操作叫 Cull,是图优化的一种。具体做法就是,对你需要的输出,例如{“R2”, “R3”},获得它们的所有依赖,和依赖的依赖… 然后将图里面不属于依赖的节点删除,就得到一个精简以后的 DAG 。

    > 每个来调用接口的独立请求里,我这里的数据源我只想调用一次,比如我不想算 R1,R2 的时候获取两次 A 数据源,以及如果在算过 R2 之后,再去算 R3 的时候要再算一边 R2 。
    我想从下往上算,比如 R3 的逻辑里里 go 出去 R2 和 C,R2 里再 go 出去 A 和 B,那我后续算 R1 的时候,怎么直接取刚刚算 R2 时的获取过的 A,A 写成单例?只要被调用后,再次被调用返回数据源? -当然还有其他的,比如错误中断之类。

    计算的顺序可以将所有节点按照依赖关系进行拓扑排序,就可以保证一个节点计算的时候,它的所有依赖节点都是被计算过的。
    计算过的节点的结果,可以用个 dict 保存一下,下次需要的时候直接按照节点名称取出就不会重新触发计算了。

  • 主 資深大佬 : yellowmarlboro

    @dayeye2006199 受教 非常感谢~

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具