猿问

大量数据竞争的 Web 应用程序

我正在编写一个 Web 应用程序。传入的请求将首先通过中间件。目前,我添加了两个中间件会话和安全性。
遍历中间件后,它将执行请求的处理程序。会话和安全中间件将在它们自己的 goroutine 中执行。

当我测试时,我有很多数据竞争,特别是在中间件部分

我使用 negroni 来处理中间件作品。


方式,我如何处理中间件


func New(res http.ResponseWriter, req *http.Request, next http.HandlerFunc) {


    if err := process(security.ServeHttp(res, req), session.ServeHttp(res, req)); err != nil {

        res.WriteHeader(http.StatusInternalServerError)

        return

    }


    log.Println("End of process middlewares")

    next(res, req)


}


// Process all middlewares

func process(chErrs ...<-chan error) error {


    for _, chErr := range chErrs {


        // Will abort the loop, when error occurs

        if err := <-chErr; err != nil {

            return err

        }


    }

    return nil

}

如您所见,每个中间件都有自己的频道。for 语句将循环直到错误通道关闭或错误发送。


服务器配置


func Config() *negroni.Negroni {

    n := negroni.Classic()

    n.Use(negroni.HandlerFunc(middlewares.New))

    n.UseHandler(routes.Set())

    return n


}

我的问题是,中间件是原因,为什么我有数据竞赛?


catspeake
浏览 166回答 1
1回答

喵喔喔

事实上,你在 goroutine 中运行中间件是问题所在。如果要并行运行中间件,则必须在 goroutine 中执行的任何中间件写入的内存周围设置互斥锁。在您的特定情况下,您正在编写和阅读ResponseWriter'sHeader
随时随地看视频慕课网APP

相关分类

Go
我要回答