如题,之前的项目中没有使用 context,高并发的场景下,日志都难以定位问题,于是准备在所有逻辑函数中加上 context (工作量有点大),并为每次请求带上 id 标识;
但是除此之外就没有其他作用了,就有点怀疑是否有必要;
有没有大佬介绍下实际中的其他使用场景和方式?( With 系列目前也没有发现有什么使用场景...)
![]() | 1 realbender 2020-11-23 17:26:50 +08:00 一般可以用来作为网络 io 调用的超时功能,你的需求可能需要在 log 打印中携带一些上下文信息,不一定要用 context |
![]() | 2 shhch OP @realbender 现在是没有使用到 context 的,有没有必要在逻辑函数里加上 context 参数往后传递,方便后续扩展使用 |
![]() | 3 xkeyideal 2020-11-23 17:41:31 +08:00 ![]() 没人使用 context 做 traceid 的事情,context 主要用途是控制子 goroutine 的存活,你的需求可以采用 WithOption 的方式 |
![]() | 4 eudore 2020-11-23 17:50:11 +08:00 http 的封装下就好,rpc 有全链路日志就是 context 传递 |
![]() | 7 yzbythesea 2020-11-23 18:22:44 +08:00 @xkeyideal 我们还是用了... |
![]() | 9 shhch OP 那有没有必要全部加上 context 字段往下传递,作为后续预留使用? |
![]() | 10 cyrivlclth 2020-11-23 19:38:05 +08:00 |
11 Exceptions 2020-11-23 19:40:27 +08:00 @xkeyideal 都用的好吧,第一个参数就是 context,无限传递 |
12 ylsc633 2020-11-23 20:02:38 +08:00 我们也用了 context 传 traceid 主要是项目是新写的, 日志和方法第一个参数都是 ctx 好处就是 性能好很多, 弊端就是有点蠢.. 如果老项目,可以用代码无侵入的方法,不过性能有点问题.. |
13 securityCoding 2020-11-23 20:08:07 +08:00 @xkeyideal 233 ,我们都在用 |
15 PiersSoCool 2020-11-23 20:15:16 +08:00 context 写定时任务,withCancel 在 gracefully shutdown 的时候很好用,监听 <-ctx.Done() 或者 <-ticker.C (继续),再用一个 channel 监听定时任务完成的消息,外层调用 cancel 等待 channel 返回数据就好 with 时间的就不多说了 而且没必要在所有函数加上 Context,几个关键入口就知道谁有问题了吧 |
16 GopherDaily 2020-11-23 20:56:33 +08:00 ![]() At Google, we require that Go programmers pass a Context parameter as the first argument to every function on the call path between incoming and outgoing requests. 建议是所有的函数的第一个都带上。 作用有几个: cancel, timeout, trace |
![]() | 17 lewinlan 2020-11-23 23:31:19 +08:00 via Android 涨姿势了…… 我以为在所有地方传递 ctx 很傻叉…… 看到大家都这样我就放心了:) |
![]() | 19 tiedan 2020-11-23 23:52:26 +08:00 我们也是 context 传 traceId 哈哈 |
21 unixeo 2020-11-24 01:07:37 +08:00 via Android trace,管理 go routine (控制超时什么的) 应该主要就这两个用了,其实就是个上下文环境了 |
![]() | 22 dingyaguang117 2020-11-24 09:07:20 +08:00 via iPhone 哈哈 tornado 单线程我们使用 contextvar Flask 使用 threadlocal Go 随时起 性能好 不过 ctx 用起来麻烦了点 |
26 tairan2006 2020-11-24 10:37:15 +08:00 cxt 的设计其实非常简单粗暴…这也是不如 java 的地方,很多时候没法对代码无侵入。 |
27 snowwalf 2020-11-24 11:11:52 +08:00 我们也是 context 传 tracerid,接入 http server/client,实现多服务全链路串联;另外 context 里带上 stack,实现模块调用堆栈打点 |
28 mooyo 2020-11-24 12:35:53 +08:00 via iPhone 我们也用了,不太理解不用 ctx 要怎么做链路的追踪 |
![]() | 29 TypeErrorNone 2020-11-24 14:18:31 +08:00 主要用来传参 |
![]() | 31 cyrivlclth 2020-11-26 09:29:39 +08:00 |
32 tairan2006 2020-11-26 19:33:48 +08:00 @cyrivlclth 侵入性太强了,以前的 code base 大的话根本改不动 |
![]() | 34 cyrivlclth 2020-12-21 20:46:00 +08:00 @tairan2006 我是觉得业务代码就别提什么侵入性了。 |