From 0e674933f3a77cc95ad73b60784d787038e734c0 Mon Sep 17 00:00:00 2001 From: zhoushuguang <15951703783@163.com> Date: Mon, 7 Sep 2020 22:40:29 +0800 Subject: [PATCH] add mr tool doc (#50) Co-authored-by: zhoushuguang --- doc/images/mr.png | Bin 0 -> 63994 bytes doc/mr.md | 176 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 176 insertions(+) create mode 100644 doc/images/mr.png create mode 100644 doc/mr.md diff --git a/doc/images/mr.png b/doc/images/mr.png new file mode 100644 index 0000000000000000000000000000000000000000..c874326236fb7d0bd05f756fc81846db72161df5 GIT binary patch literal 63994 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 literal 0 HcmV?d00001 diff --git a/doc/mr.md b/doc/mr.md new file mode 100644 index 00000000..ac13d6c7 --- /dev/null +++ b/doc/mr.md @@ -0,0 +1,176 @@ +# go-zero如何通过MapReduce降低服务的响应时间 + +go-zero微服务框架中提供了许多开箱即用的工具,好的工具不仅能提升服务的性能而且还能提升代码的鲁棒性避免出错,实现代码风格的统一方便他人阅读等等,本系列文章将分别介绍go-zero框架中工具的使用及其实现原理 + +## 并发处理工具[MapReduce](https://github.com/tal-tech/go-zero/tree/master/core/mr) + +[MapReduce](https://zh.wikipedia.org/wiki/MapReduce)是Google提出的一个软件架构,用于大规模数据集的并行运算,go-zero中的MapReduce工具正是借鉴了这种架构思想 + +go-zero框架中的MapReduce工具主要用来对批量数据进行并发的处理,以此来提升服务的性能 + +![mapreduce原理图](./images/mr.png) + +我们通过几个示例来演示MapReduce的用法 + +MapReduce主要有三个参数,第一个参数为generate用以生产数据,第二个参数为mapper用以对数据进行处理,第三个参数为reducer用以对mapper后的数据做聚合返回,还可以通过opts选项设置并发处理的线程数量 + +场景一: 某些功能的结果往往需要依赖多个服务,比如商品详情的结果往往会依赖用户服务、库存服务、订单服务等等,一般被依赖的服务都是以rpc的形式对外提供,为了降低依赖的耗时我们往往需要对依赖做并行处理 + +``` +func productDetail(uid, pid int64) (*ProductDetail, error) { + var pd ProductDetail + err := mr.Finish(func() (err error) { + pd.User, err = userRpc.User(uid) + return + }, func() (err error) { + pd.Store, err = storeRpc.Store(pid) + return + }, func() (err error) { + pd.Order, err = orderRpc.Order(pid) + return + }) + + if err != nil { + log.Printf("product detail error: %v", err) + return nil, err + } + + return &pd, nil +} +``` +该示例中返回商品详情依赖了多个服务获取数据,因此做并发的依赖处理,对接口的性能有很大的提升 + +场景二: 很多时候我们需要对一批数据进行处理,比如对一批用户id,效验每个用户的合法性并且效验过程中有一个出错就认为效验失败,返回的结果为效验合法的用户id + +``` +func checkLegal(uids []int64) ([]int64, error) { + r, err := mr.MapReduce(func(source chan<- interface{}) { + for _, uid := range uids { + source <- uid + } + }, func(item interface{}, writer mr.Writer, cancel func(error)) { + uid := item.(int64) + ok, err := check(uid) + if err != nil { + cancel(err) + } + if ok { + writer.Write(uid) + } + }, func(pipe <-chan interface{}, writer mr.Writer, cancel func(error)) { + var uids []int64 + for p := range pipe { + uids = append(uids, p.(int64)) + } + writer.Write(uids) + }) + if err != nil { + log.Printf("check error: %v", err) + return nil, err + } + + return r.([]int64), nil +} + +func check(uid int64) (bool, error) { + // do something check user legal + return true, nil +} +``` +该示例中,如果check过程出现错误则通过cancel方法结束效验过程,并返回error整个效验过程结束,如果某个uid效验结果为false则最终结果不返回该uid + +**MapReduce使用注意事项** +* mapper和reducer中都可以调用cancel,参数为error,调用后立即返回,返回结果为nil, error +* mapper中如果不调用writer.Write则item最终不会被reducer聚合 +* reducer中如果不调用writer.Wirte则返回结果为nil, ErrReduceNoOutput +* reducer为单线程,所有mapper出来的结果在这里串行聚合 + +***实现原理分析:*** + +MapReduce中首先通过buildSource方法通过执行generate(参数为无缓冲channel)产生数据,并返回无缓冲的channel,mapper会从该channel中读取数据 +``` +func buildSource(generate GenerateFunc) chan interface{} { + source := make(chan interface{}) + go func() { + defer close(source) + generate(source) + }() + + return source +} +``` + +在MapReduceWithSource方法中定义了cancel方法,mapper和reducer中都可以调用该方法,调用后主线程收到close信号会立马返回 +``` +cancel := once(func(err error) { + if err != nil { + retErr.Set(err) + } else { + // 默认的error + retErr.Set(ErrCancelWithNil) + } + + drain(source) + // 调用close(ouput)主线程收到Done信号,立马返回 + finish() +}) +``` + +在mapperDispatcher方法中调用了executeMappers,executeMappers消费buildSource产生的数据,每一个item都会起一个goroutine单独处理,默认最大并发数为16,可以通过WithWorkers进行设置 +``` +var wg sync.WaitGroup +defer func() { + wg.Wait() // 保证所有的item都处理完成 + close(collector) +}() + +pool := make(chan lang.PlaceholderType, workers) +writer := newGuardedWriter(collector, done) // 将mapper处理完的数据写入collector +for { + select { + case <-done: // 当调用了cancel会触发立即返回 + return + case pool <- lang.Placeholder: // 控制最大并发数 + item, ok := <-input + if !ok { + <-pool + return + } + + wg.Add(1) + go func() { + defer func() { + wg.Done() + <-pool + }() + + mapper(item, writer) // 对item进行处理,处理完调用writer.Write把结果写入collector对应的channel中 + }() + } +} +``` + +reducer单goroutine对数mapper写入collector的数据进行处理,如果reducer中没有手动调用writer.Write则最终会执行finish方法对output进行close避免死锁 +``` +go func() { + defer func() { + if r := recover(); r != nil { + cancel(fmt.Errorf("%v", r)) + } else { + finish() + } + }() + reducer(collector, writer, cancel) +}() +``` + +在该工具包中还提供了许多针对不同业务场景的方法,实现原理与MapReduce大同小异,感兴趣的同学可以查看源码学习 +* MapReduceVoid 功能和MapReduce类似但没有结果返回只返回error +* Finish 处理固定数量的依赖,返回error,有一个error立即返回 +* FinishVoid 和Finish方法功能类似,没有返回值 +* Map 只做generate和mapper处理,返回channel +* MapVoid 和Map功能类似,无返回 + + +本文主要介绍了go-zero框架中的MapReduce工具,在实际的项目中非常实用。用好工具对于提升服务性能和开发效率都有很大的帮助,go-zero框架中还提供了许多其他的实用工具,由于篇幅有限后续文章再做介绍,希望本篇文章能给大家带来帮助 +