如题,之前的项目中没有使用 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 1
没人使用 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 1
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
unixeno 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 我是觉得业务代码就别提什么侵入性了。
|