如何优化处理大数据

How to optimise processing large data

我的后端服务objective是处理9000万条数据,1天至少1000万条数据。

我的系统配置:

我现在正在做的事情是这样的:

var wg sync.WaitGroup
//length of evs is 4455
for i, ev := range evs {
                wg.Add(1)
                go migrate(&wg)
            }
wg.Wait()

func migrate(wg *sync.WaitGroup) {
defer wg.Done()
//processing 
time.Sleep(time.Second)
}

在不了解您需要完成的工作类型的更多细节的情况下,您的方法似乎不错。需要考虑的一些事情:

  • 在处理循环中重复使用变量和/或客户端。例如重用 HTTP 客户端而不是重新创建一个。

  • 取决于您的用例调用如何处理故障。使用 erroGroup 可能更有效。这是一个方便的包装器,可以在出错时停止所有线程,可能会为您节省大量时间。

  • 在迁移函数中一定要注意关于 closure and goroutines.

    的注意事项
func main() {
    g := new(errgroup.Group)
    var urls = []string{
        "http://www.someasdfasdfstupidname.com/",
        "ftp://www.golang.org/",
        "http://www.google.com/",
    }
    for _, url := range urls {
        url := url // https://golang.org/doc/faq#closures_and_goroutines
        g.Go(func() error {
            resp, err := http.Get(url)
            if err == nil {
                resp.Body.Close()
            }
            return err
        })
    }

    fmt.Println("waiting")
    if err := g.Wait(); err == nil {
        fmt.Println("Successfully fetched all URLs.")
    } else {
        fmt.Println(err)
    }
}

我找到了解决办法。为了实现如此巨大的处理,我所做的是 将 goroutine 的数量限制为 50 个,并将核心数量从 2 个增加到 5 个。