本文介绍: 公司运行的服务代码中,随处可见各种各样的日志信息,其中大多数是用来记录各种异常的日志,一方面,当出现问题时,通过日志我们可以快速的定位引发问题的原因;另外我们可以通过日志平台,对一些错误级别比较高的日志进行监控,从而能够快速响应系统可能会出现的问题。在Go语言中,Context是一个非常重要的概念,它存在于一个完整的业务生命周期内,ContextDeadline()Done()Err()和Value()。其中,Deadline()方法返回context的截止日期,Done()方法返回一个只读的。
前言
公司运行的服务代码中,随处可见各种各样的日志信息,其中大多数是用来记录各种异常的日志,一方面,当出现问题时,通过日志我们可以快速的定位引发问题的原因;另外我们可以通过日志平台,对一些错误级别比较高的日志进行监控,从而能够快速响应系统可能会出现的问题。
起因:日志告警引发的思考
虽然日志告警很有用,但如果告警次数过于频繁,反而会降低开发人员对于系统异常的敏感度,使得告警变得毫无意义。因此,我们需要对告警进行治理。最近,由于一次治理线上频发的超时告警,使得笔者开始思考起context deadline exceed
异常的问题。
什么是context
在Go语言中,Context
是一个非常重要的概念,它存在于一个完整的业务生命周期内,Context
类型是一个接口类型,它定义了四个方法:Deadline()
、Done()
、Err()
和Value()
。其中,Deadline()
方法返回context
的截止日期,Done()
方法返回一个只读的channel
,当Context
被取消或超时时,该channel
会被关闭,Err()
方法返回Context
被取消的原因,Value()
方法返回Context
中与key
相关联的值。
context的作用
在实际应用中,我们可以使用Context包来传递请求的元数据,例如请求ID、超时信息等等。此外,我们还可以使用context包来控制goroutine
的生命周期(最常见的),例如在HTTP请求处理程序中,我们可以使用context包来取消正在处理的请求。
可以说,我们的服务里,随处可见携带context
参数的方法。
context超时之后
继续执行 or 中断
最后
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。