cap*_*aig 15
上下文传递最常见的需求之一是将传出请求与传入请求相关联.我已经将它用于各种目的,例如:
许多语言和平台都有方便/神奇的方式来获取当前的Http请求.C#具有HttpRequest.Current
全局可用(通过线程本地存储)给想要了解当前http请求的上下文的任何人.您可以在其上设置任意数据以传达各种上下文数据.其他平台也有类似的设施.
由于go没有goroutine本地存储的功能,因此无法在当前http请求的上下文中存储全局变量.相反,在系统边界初始化上下文(传入请求)是惯用的,并将其作为参数传递给需要访问该信息的任何下游组件.
一个超级简单的方法是使用当前的http请求创建一个上下文对象并传递它:
func someHandler(w http.ResponseWriter, r * http.Request){
ctx := context.WithValue(context.Background(),"request",r)
myDatabase.doSomething(ctx,....)
}
Run Code Online (Sandbox Code Playgroud)
您当然可以将其限制为需要传递的更有针对性的数据集,而不是整个请求.
上下文包帮助的另一件事(我认为博客确实可以指出),是超时或截止日期的常见框架.
请注意,上下文包不会为您强制执行超时.由接收上下文对象的组件来观察完成通道并自行取消它们自己的http请求或数据库调用或计算等等.
能够从组件外部管理超时非常有用.如果我有一个数据库模块,我不需要硬编码超时值,只能处理从外部触发的超时.
我这样做的一种方法是在每个传入请求中进行多次db/service调用的服务中.如果总时间超过1秒,我想中止所有出站操作并返回部分或错误结果.在顶层使用超时初始化上下文并将其传递给所有依赖项是一种非常简单的方法来管理它.
依赖听取完成频道并中止它的工作并不总是很好,但正如博客所示,它也不是非常痛苦.
归档时间: |
|
查看次数: |
2953 次 |
最近记录: |