用http.HandleFunc实现了一个http服务器,接受浏览器访问,浏览器的每次请求都会带1个参数logid,每个请求的logid都是唯一的。
对于每次请求,http服务器的处理步骤是:main.go接受参数logid,随后依次跳转到不同的go文件处理,每个go文件又会经过多个不同函数处理,处理过程中遇到异常情况会将logid写到日志文件。
现在问题是:在高并发情况下,如何保证写入日志文件中的logid对应的是相应的请求?比如先后来了两个请求1和2,分别对应的logid是10001和10002,如果用全局变量LOGID来存放logid,那么请求1先到,LOGID被赋值为10001,随后请求2到时LOGID被重新赋值成了10002,此时如果请求1出现异常,就会把10002写到日志文件中(但其实请求1对应的logid应该是10001)。
看到一种解决方案:https://github.com/wuxicn/logex,可以获取每个gorountine的goid,把goid当成logid,可以避免将logid一直当成参数传递,需要时可以随时取出
#14
更多评论