Skip to content

Commit

Permalink
Do not recreate mux router for each incoming request
Browse files Browse the repository at this point in the history
(*App).context, called in the HTTP handler on each request, creates a
URLBuilder, which involves calling Router(). This shows up in profiles a
hot spot because it involves compiling the regexps which define all the
routes. For efficiency, cache the router and return the same object each
time.

It appears to be safe to reuse the router because GetRoute is the only
method ever called on the returned router object.

Signed-off-by: Aaron Lehmann <alehmann@netflix.com>
  • Loading branch information
aaronlehmann committed Jul 8, 2022
1 parent edf5aa3 commit 853e2e9
Showing 1 changed file with 14 additions and 2 deletions.
16 changes: 14 additions & 2 deletions registry/api/v2/routes.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
package v2

import "github.com/gorilla/mux"
import (
"sync"

"github.com/gorilla/mux"
)

// The following are definitions of the name under which all V2 routes are
// registered. These symbols can be used to look up a route based on the name.
Expand All @@ -14,11 +18,19 @@ const (
RouteNameCatalog = "catalog"
)

var (
baseRouter *mux.Router
createBaseRouterOnce sync.Once
)

// Router builds a gorilla router with named routes for the various API
// methods. This can be used directly by both server implementations and
// clients.
func Router() *mux.Router {
return RouterWithPrefix("")
createBaseRouterOnce.Do(func() {
baseRouter = RouterWithPrefix("")
})
return baseRouter
}

// RouterWithPrefix builds a gorilla router with a configured prefix
Expand Down

0 comments on commit 853e2e9

Please sign in to comment.