用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)。
建立一个结构体A,包含一个字段logid,一个全局的map,logid对应一个结构体。
每次有连接进来的时候,可以查看是否已经初始化结构体。然后把所有的操作,包含在A的一个函数中。在A中捕获异常。如果不是异常,只是想记录行为的话,把所有的操作定义为一个接口B的操作,然后A实现接口B。
#7
更多评论