我的后端服务的目标是在 1 天内处理 9000 万条数据和至少 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)
}
答案 0 :(得分:0)
在不了解您需要完成的工作类型的更多细节的情况下,您的方法似乎不错。一些需要考虑的事情:
在处理循环中重用变量和/或客户端。例如重用一个 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)
}
}
答案 1 :(得分:-1)
我已经找到了解决方案。为了实现如此巨大的处理,我所做的是 将有限数量的 goroutine 限制为 50 个,并将内核数量从 2 个增加到 5 个。