gpt4 book ai didi

go - 在上下文中存储请求和 session ID。上下文被认为是错误的?

转载 作者:IT王子 更新时间:2023-10-29 01:15:03 26 4
gpt4 key购买 nike

Jack Lindamood 有这篇优秀的博文 How to correctly use context.Context in Go 1.7归结为以下报价:

Context.Value should inform, not control. This is the primary mantra that I feel should guide if you are using context.Value correctly. The content of context.Value is for maintainers not users. It should never be required input for documented or expected results.

目前,我正在使用 Context 来传输以下信息:

  • RequestID 在客户端生成,传递给 Go 后端,它仅通过命令链,然后再次插入响应中。如果响应中没有 RequestID,客户端就会中断。

  • SessionID 标识 WebSocket session ,当在异步计算(例如工作队列)中生成某些响应时,这很重要,以便识别应该在哪个 WebSocket session 上发送响应。

当非常认真地对待这个定义时,我会说两者都违反了 context.Context 的意图,但是它们的值在整个请求发出时不会改变任何行为,它只在生成响应。

还有什么选择?在服务器 API 中为元数据使用 context.Context 实际上有助于维护精益方法签名,因为该数据实际上与 API 无关,但仅对传输层重要,这就是我不愿意创建某些东西的原因像一个请求结构:

type Request struct {
RequestID string
SessionID string
}

并使其成为每个 API 方法的一部分,该方法仅存在于发送响应之前通过。

最佳答案

根据我的理解,上下文应该仅限于传递诸如请求或 session ID 之类的内容。在我的应用程序中,我在我的一个中间件中做了类似下面的事情。有助于提高可观察性

if next != nil {
if requestID != "" {
b := context.WithValue(r.Context(), "requestId", requestID)
r = r.WithContext(b)
}
next.ServeHTTP(w, r)
}

关于go - 在上下文中存储请求和 session ID。上下文被认为是错误的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42478237/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com