分享
  1. 首页
  2. 文章

Go: 在我们的 ETL 中使用扇出模式

gogeof · · 2014 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

![](https://raw.githubusercontent.com/studygolang/gctt-images/master/20190703-go-fan-out-pattern/cover.png) Go 语言在构建微服务、特别是有使用 gRPC 的应用中,非常地流行,其实在构建命令行程序时也是特别地好用。为了学习扇出模式,我会基于我们公司使用 ETL 的例子,来介绍这个模式。 ## ETL ETL(提取(Extract),转换(Transform),加载(Load))通常都需要处理大量的数据。在这样的场景下,有一个好的并发策略对于 ETL 来说,能够带来巨大的性能提升。 ETL 中有两个最重要的部分是提取(extracting)和加载(Load),通常它们都跟数据库有关,瓶颈通常也属于老生常谈的话题:网络带宽,查询性能等等。基于我们要处理的数据以及瓶颈所在,两种模式对于处理数据或者处理输入流的编码和解码过程中,非常有用。 ## 扇入扇出模式(Fan-in, fan-out pattern) 扇入和扇出模式在并发场景中能得到较大的好处。这里将对它们逐个做专门的介绍(review): 扇出,在 GO 博客中这样定义: 多个函数能够同时从相同的 channel 中读数据,直到 channel 关闭。 这种模式在快速输入流到分布式数据处理中,有一定的优势: ![fan-out pattern with distributed work](https://raw.githubusercontent.com/studygolang/gctt-images/master/20190703-go-fan-out-pattern/1.png) 扇入,在 Google 这样定义: 一个函数可以从多个输入中读取,并继续操作,直到所有 channel 所关联的输入端,都已经关闭。 这种模式,在有多个输入源,且需要快速地数据处理中,有一定的优势: ![fan-in pattern with multiple inputs](https://raw.githubusercontent.com/studygolang/gctt-images/master/20190703-go-fan-out-pattern/2.png) ## 在实际中使用扇出模式(Fan-out in action) 在我们的项目中,我们需要处理存储在 CSV 文件的大量数据,它们加载后,将在 elastic 中被检索。输入的处理必须快,否则(阻塞加载)加载就会变得很慢。因此,我们需要比输入生成器更多的数据处理器。扇出模式在这个例子中,看起来非常适合: ![](https://raw.githubusercontent.com/studygolang/gctt-images/master/20190703-go-fan-out-pattern/3.png) 下面是我们的伪代码: ```bash Variables: data chan Start: // a goroutine will parse the CSV and will send it to the channel ParseCSV(data<-) // a goroutine is started for each workers, defined as command line arguments For each worker in workers Start goroutine For each value in <-data Insert the value in database by chunk of 50 Wait for the workers Stop ``` 输入和加载程序是并发执行的,我们不需要等到解析完成后再开始启动数据处理程序。 这种模式让我们可以单独考虑业务逻辑的同时,还可以使用(Go)并发的特性。几个工作器之间原生的分布式负载能力,有助于我们解决此类过程中的峰值负载问题。

via: https://medium.com/a-journey-with-go/go-fan-out-pattern-in-our-etl-9357a1731257

作者:Vincent Blanchon 译者:gogeof 校对:lxbwolf

本文由 GCTT 原创编译,Go语言中文网 荣誉推出

本文由 GCTT 原创翻译,Go语言中文网 首发。也想加入译者行列,为开源做一些自己的贡献么?欢迎加入 GCTT!
翻译工作和译文发表仅用于学习和交流目的,翻译工作遵照 CC-BY-NC-SA 协议规定,如果我们的工作有侵犯到您的权益,请及时联系我们。

欢迎遵照 CC-BY-NC-SA 协议规定 转载,敬请在正文中标注并保留原文/译文链接和作者/译者等信息。
文章仅代表作者的知识和看法,如有不同观点,请楼下排队吐槽


有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
2014 次点击
被以下专栏收入,发现更多相似内容
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏