Go微服务实战
上QQ阅读APP看书,第一时间看更新

8.3.1 应用场景

下面先来介绍在http请求中context的作用。每一个http请求的request都会启动一个goroutine处理这个请求,后续跟进这个请求可能还需要访问数据库、做安全验证、访问控制、日志记录等,这时候会由最早的那个goroutine启动后续的多个goroutine,这样就会有多个goroutine处理一个request。而context的作用就是在这几个不同的goroutine之间同步特定数据、取消信号以及处理请求的截止日期,如图8-5所示。

图8-5 go context

context最常规的做法就是从goroutine开始,一层层地把信息传递到最下层。如果没有context,就可能发生如图8-6所示的情况。在图8-6中,最上层的已经因为报错而结束,但是下层的goroutine却还在继续。

图8-6 不使用context的情景

如果有了context,当上层goroutine发生错误而结束时,可以很快地同步信息到其下层的goroutine,这样可以及时停止下层goroutine,避免无谓的系统消耗,如图8-7所示。

图8-7 使用context的情景

上面介绍的就是context的最大作用,理解了它,接下来就更容易理解context的设计了。