在context.Context中存储请求和会话ID被认为是坏的?

时间:2017-02-27 05:14:05

标签: go websocket response middleware

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

  

Context.Value应该通知,而不是控制。如果您正确使用context.Value,这是我认为应该引导的主要口头禅。该   context.Value的内容是维护者而不是用户。它永远不应该   是记录或预期结果的必要输入。

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

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

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

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

有什么替代方案?在服务器API中使用context.Context元数据实际上有助于维护精益方法签名,因为这些数据与API无关,但对传输层非常重要,这就是为什么我不愿意创建类似请求结构的东西:

type Request struct {
    RequestID string
    SessionID string
}

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

1 个答案:

答案 0 :(得分:0)

根据我的理解,上下文应仅限于传递诸如请求或会话ID之类的内容。在我的应用程序中,我在其中一种中间件中执行以下操作。有助于观察

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