dataloader - set maxBatch to 200 and wait to 2 milliseconds
This commit is contained in:
parent
9516140c0f
commit
44c90d0efc
|
@ -1,4 +1,4 @@
|
||||||
package dataloaders
|
package dataloader
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
@ -12,10 +12,11 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
wait = 4 * time.Millisecond
|
wait = 2 * time.Millisecond
|
||||||
|
maxBatch = 200
|
||||||
)
|
)
|
||||||
|
|
||||||
type DataLoaders struct {
|
type DataLoader struct {
|
||||||
VersionByCode *VersionLoader
|
VersionByCode *VersionLoader
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -26,11 +27,11 @@ type Config struct {
|
||||||
VersionRepo version.Repository
|
VersionRepo version.Repository
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewDataLoaders(cfg Config) *DataLoaders {
|
func NewDataLoader(cfg Config) *DataLoader {
|
||||||
return &DataLoaders{
|
return &DataLoader{
|
||||||
VersionByCode: &VersionLoader{
|
VersionByCode: &VersionLoader{
|
||||||
wait: wait,
|
wait: wait,
|
||||||
maxBatch: 0,
|
maxBatch: maxBatch,
|
||||||
fetch: func(keys []string) ([]*twmodel.Version, []error) {
|
fetch: func(keys []string) ([]*twmodel.Version, []error) {
|
||||||
var codes []twmodel.VersionCode
|
var codes []twmodel.VersionCode
|
||||||
for _, code := range keys {
|
for _, code := range keys {
|
|
@ -1,6 +1,6 @@
|
||||||
// Code generated by github.com/vektah/dataloaden, DO NOT EDIT.
|
// Code generated by github.com/vektah/dataloaden, DO NOT EDIT.
|
||||||
|
|
||||||
package dataloaders
|
package dataloader
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/tribalwarshelp/shared/tw/twmodel"
|
"github.com/tribalwarshelp/shared/tw/twmodel"
|
|
@ -1,6 +1,6 @@
|
||||||
// Code generated by github.com/vektah/dataloaden, DO NOT EDIT.
|
// Code generated by github.com/vektah/dataloaden, DO NOT EDIT.
|
||||||
|
|
||||||
package dataloaders
|
package dataloader
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/tribalwarshelp/shared/tw/twmodel"
|
"github.com/tribalwarshelp/shared/tw/twmodel"
|
|
@ -1,6 +1,6 @@
|
||||||
// Code generated by github.com/vektah/dataloaden, DO NOT EDIT.
|
// Code generated by github.com/vektah/dataloaden, DO NOT EDIT.
|
||||||
|
|
||||||
package dataloaders
|
package dataloader
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"sync"
|
"sync"
|
|
@ -1,4 +1,4 @@
|
||||||
package dataloaders
|
package dataloader
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
@ -9,17 +9,17 @@ import (
|
||||||
"github.com/tribalwarshelp/api/village"
|
"github.com/tribalwarshelp/api/village"
|
||||||
)
|
)
|
||||||
|
|
||||||
type ServerDataLoaders struct {
|
type ServerDataLoader struct {
|
||||||
PlayerByID *PlayerLoader
|
PlayerByID *PlayerLoader
|
||||||
TribeByID *TribeLoader
|
TribeByID *TribeLoader
|
||||||
VillageByID *VillageLoader
|
VillageByID *VillageLoader
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewServerDataLoaders(server string, cfg Config) *ServerDataLoaders {
|
func NewServerDataLoader(server string, cfg Config) *ServerDataLoader {
|
||||||
return &ServerDataLoaders{
|
return &ServerDataLoader{
|
||||||
PlayerByID: &PlayerLoader{
|
PlayerByID: &PlayerLoader{
|
||||||
wait: wait,
|
wait: wait,
|
||||||
maxBatch: 0,
|
maxBatch: maxBatch,
|
||||||
fetch: func(ids []int) ([]*twmodel.Player, []error) {
|
fetch: func(ids []int) ([]*twmodel.Player, []error) {
|
||||||
players, _, err := cfg.PlayerRepo.Fetch(context.Background(), player.FetchConfig{
|
players, _, err := cfg.PlayerRepo.Fetch(context.Background(), player.FetchConfig{
|
||||||
Filter: &twmodel.PlayerFilter{
|
Filter: &twmodel.PlayerFilter{
|
||||||
|
@ -47,7 +47,7 @@ func NewServerDataLoaders(server string, cfg Config) *ServerDataLoaders {
|
||||||
},
|
},
|
||||||
TribeByID: &TribeLoader{
|
TribeByID: &TribeLoader{
|
||||||
wait: wait,
|
wait: wait,
|
||||||
maxBatch: 0,
|
maxBatch: maxBatch,
|
||||||
fetch: func(ids []int) ([]*twmodel.Tribe, []error) {
|
fetch: func(ids []int) ([]*twmodel.Tribe, []error) {
|
||||||
tribes, _, err := cfg.TribeRepo.Fetch(context.Background(), tribe.FetchConfig{
|
tribes, _, err := cfg.TribeRepo.Fetch(context.Background(), tribe.FetchConfig{
|
||||||
Server: server,
|
Server: server,
|
||||||
|
@ -75,7 +75,7 @@ func NewServerDataLoaders(server string, cfg Config) *ServerDataLoaders {
|
||||||
},
|
},
|
||||||
VillageByID: &VillageLoader{
|
VillageByID: &VillageLoader{
|
||||||
wait: wait,
|
wait: wait,
|
||||||
maxBatch: 0,
|
maxBatch: maxBatch,
|
||||||
fetch: func(ids []int) ([]*twmodel.Village, []error) {
|
fetch: func(ids []int) ([]*twmodel.Village, []error) {
|
||||||
villages, _, err := cfg.VillageRepo.Fetch(context.Background(), village.FetchConfig{
|
villages, _, err := cfg.VillageRepo.Fetch(context.Background(), village.FetchConfig{
|
||||||
Server: server,
|
Server: server,
|
|
@ -1,6 +1,6 @@
|
||||||
// Code generated by github.com/vektah/dataloaden, DO NOT EDIT.
|
// Code generated by github.com/vektah/dataloaden, DO NOT EDIT.
|
||||||
|
|
||||||
package dataloaders
|
package dataloader
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/tribalwarshelp/shared/tw/twmodel"
|
"github.com/tribalwarshelp/shared/tw/twmodel"
|
|
@ -1,20 +1,20 @@
|
||||||
package dataloaders
|
package dataloader
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"github.com/tribalwarshelp/shared/tw/twmodel"
|
"github.com/tribalwarshelp/shared/tw/twmodel"
|
||||||
)
|
)
|
||||||
|
|
||||||
type VersionDataLoaders struct {
|
type VersionDataLoader struct {
|
||||||
PlayerServersByID *PlayerServersLoader
|
PlayerServersByID *PlayerServersLoader
|
||||||
PlayerNameChangesByID *PlayerNameChangesLoader
|
PlayerNameChangesByID *PlayerNameChangesLoader
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewVersionDataLoaders(versionCode twmodel.VersionCode, cfg Config) *VersionDataLoaders {
|
func NewVersionDataLoader(versionCode twmodel.VersionCode, cfg Config) *VersionDataLoader {
|
||||||
return &VersionDataLoaders{
|
return &VersionDataLoader{
|
||||||
PlayerServersByID: &PlayerServersLoader{
|
PlayerServersByID: &PlayerServersLoader{
|
||||||
wait: wait,
|
wait: wait,
|
||||||
maxBatch: 0,
|
maxBatch: maxBatch,
|
||||||
fetch: func(keys []int) ([][]string, []error) {
|
fetch: func(keys []int) ([][]string, []error) {
|
||||||
playerServersByID, err := cfg.PlayerRepo.FetchPlayerServers(context.Background(), versionCode, keys...)
|
playerServersByID, err := cfg.PlayerRepo.FetchPlayerServers(context.Background(), versionCode, keys...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -29,7 +29,7 @@ func NewVersionDataLoaders(versionCode twmodel.VersionCode, cfg Config) *Version
|
||||||
},
|
},
|
||||||
PlayerNameChangesByID: &PlayerNameChangesLoader{
|
PlayerNameChangesByID: &PlayerNameChangesLoader{
|
||||||
wait: wait,
|
wait: wait,
|
||||||
maxBatch: 0,
|
maxBatch: maxBatch,
|
||||||
fetch: func(keys []int) ([][]*twmodel.PlayerNameChange, []error) {
|
fetch: func(keys []int) ([][]*twmodel.PlayerNameChange, []error) {
|
||||||
playerNameChangesByID, err := cfg.PlayerRepo.FetchNameChanges(context.Background(), versionCode, keys...)
|
playerNameChangesByID, err := cfg.PlayerRepo.FetchNameChanges(context.Background(), versionCode, keys...)
|
||||||
if err != nil {
|
if err != nil {
|
|
@ -1,6 +1,6 @@
|
||||||
// Code generated by github.com/vektah/dataloaden, DO NOT EDIT.
|
// Code generated by github.com/vektah/dataloaden, DO NOT EDIT.
|
||||||
|
|
||||||
package dataloaders
|
package dataloader
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/tribalwarshelp/shared/tw/twmodel"
|
"github.com/tribalwarshelp/shared/tw/twmodel"
|
|
@ -1,6 +1,6 @@
|
||||||
// Code generated by github.com/vektah/dataloaden, DO NOT EDIT.
|
// Code generated by github.com/vektah/dataloaden, DO NOT EDIT.
|
||||||
|
|
||||||
package dataloaders
|
package dataloader
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/tribalwarshelp/shared/tw/twmodel"
|
"github.com/tribalwarshelp/shared/tw/twmodel"
|
|
@ -49,7 +49,6 @@ func graphqlHandler(cfg generated.Config) gin.HandlerFunc {
|
||||||
|
|
||||||
srv.AddTransport(transport.GET{})
|
srv.AddTransport(transport.GET{})
|
||||||
srv.AddTransport(transport.POST{})
|
srv.AddTransport(transport.POST{})
|
||||||
srv.AddTransport(transport.MultipartForm{})
|
|
||||||
srv.Use(extension.Introspection{})
|
srv.Use(extension.Introspection{})
|
||||||
srv.Use(extension.AutomaticPersistedQuery{
|
srv.Use(extension.AutomaticPersistedQuery{
|
||||||
Cache: lru.New(100),
|
Cache: lru.New(100),
|
||||||
|
|
|
@ -12,7 +12,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
func (r *serverResolver) Version(ctx context.Context, obj *twmodel.Server) (*twmodel.Version, error) {
|
func (r *serverResolver) Version(ctx context.Context, obj *twmodel.Server) (*twmodel.Version, error) {
|
||||||
loaders := middleware.DataLoadersFromContext(ctx)
|
loaders := middleware.DataLoaderFromContext(ctx)
|
||||||
if loaders != nil {
|
if loaders != nil {
|
||||||
lv, _ := loaders.VersionByCode.Load(obj.VersionCode.String())
|
lv, _ := loaders.VersionByCode.Load(obj.VersionCode.String())
|
||||||
return lv, nil
|
return lv, nil
|
||||||
|
|
4
main.go
4
main.go
|
@ -18,7 +18,7 @@ import (
|
||||||
httpdelivery "github.com/tribalwarshelp/api/graphql/delivery/http"
|
httpdelivery "github.com/tribalwarshelp/api/graphql/delivery/http"
|
||||||
"github.com/tribalwarshelp/api/graphql/resolvers"
|
"github.com/tribalwarshelp/api/graphql/resolvers"
|
||||||
|
|
||||||
"github.com/tribalwarshelp/api/graphql/dataloaders"
|
"github.com/tribalwarshelp/api/graphql/dataloader"
|
||||||
|
|
||||||
dailyplayerstatsrepo "github.com/tribalwarshelp/api/dailyplayerstats/repository"
|
dailyplayerstatsrepo "github.com/tribalwarshelp/api/dailyplayerstats/repository"
|
||||||
dailyplayerstatsucase "github.com/tribalwarshelp/api/dailyplayerstats/usecase"
|
dailyplayerstatsucase "github.com/tribalwarshelp/api/dailyplayerstats/usecase"
|
||||||
|
@ -132,7 +132,7 @@ func main() {
|
||||||
middleware.DataLoadersToContextConfig{
|
middleware.DataLoadersToContextConfig{
|
||||||
ServerRepo: serverRepo,
|
ServerRepo: serverRepo,
|
||||||
},
|
},
|
||||||
dataloaders.Config{
|
dataloader.Config{
|
||||||
PlayerRepo: playerRepo,
|
PlayerRepo: playerRepo,
|
||||||
TribeRepo: tribeRepo,
|
TribeRepo: tribeRepo,
|
||||||
VillageRepo: villageRepo,
|
VillageRepo: villageRepo,
|
||||||
|
|
|
@ -10,23 +10,23 @@ import (
|
||||||
|
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
|
|
||||||
"github.com/tribalwarshelp/api/graphql/dataloaders"
|
"github.com/tribalwarshelp/api/graphql/dataloader"
|
||||||
"github.com/tribalwarshelp/api/server"
|
"github.com/tribalwarshelp/api/server"
|
||||||
)
|
)
|
||||||
|
|
||||||
var serverDataLoadersContextKey ContextKey = "serverDataLoaders"
|
var serverDataLoadersContextKey ContextKey = "serverDataLoaders"
|
||||||
var versionLoadersContextKey ContextKey = "versionLoaders"
|
var versionDataLoadersContextKey ContextKey = "versionLoaders"
|
||||||
var dataloadersContextKey ContextKey = "dataloaders"
|
var dataLoaderContextKey ContextKey = "dataloader"
|
||||||
|
|
||||||
type DataLoadersToContextConfig struct {
|
type DataLoadersToContextConfig struct {
|
||||||
ServerRepo server.Repository
|
ServerRepo server.Repository
|
||||||
}
|
}
|
||||||
|
|
||||||
func DataLoadersToContext(dltcc DataLoadersToContextConfig, cfg dataloaders.Config) gin.HandlerFunc {
|
func DataLoadersToContext(dltcc DataLoadersToContextConfig, cfg dataloader.Config) gin.HandlerFunc {
|
||||||
return func(c *gin.Context) {
|
return func(c *gin.Context) {
|
||||||
ctx := c.Request.Context()
|
ctx := c.Request.Context()
|
||||||
serverDataLoaders := make(map[string]*dataloaders.ServerDataLoaders)
|
serverDataLoaders := make(map[string]*dataloader.ServerDataLoader)
|
||||||
versionDataLoaders := make(map[twmodel.VersionCode]*dataloaders.VersionDataLoaders)
|
versionDataLoaders := make(map[twmodel.VersionCode]*dataloader.VersionDataLoader)
|
||||||
servers, _, err := dltcc.ServerRepo.Fetch(c.Request.Context(), server.FetchConfig{
|
servers, _, err := dltcc.ServerRepo.Fetch(c.Request.Context(), server.FetchConfig{
|
||||||
Columns: []string{strutil.Underscore("versionCode"), "key"},
|
Columns: []string{strutil.Underscore("versionCode"), "key"},
|
||||||
Select: true,
|
Select: true,
|
||||||
|
@ -39,54 +39,54 @@ func DataLoadersToContext(dltcc DataLoadersToContextConfig, cfg dataloaders.Conf
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
for _, serv := range servers {
|
for _, serv := range servers {
|
||||||
serverDataLoaders[serv.Key] = dataloaders.NewServerDataLoaders(serv.Key, cfg)
|
serverDataLoaders[serv.Key] = dataloader.NewServerDataLoader(serv.Key, cfg)
|
||||||
if _, ok := versionDataLoaders[serv.VersionCode]; !ok {
|
if _, ok := versionDataLoaders[serv.VersionCode]; !ok {
|
||||||
versionDataLoaders[serv.VersionCode] = dataloaders.NewVersionDataLoaders(serv.VersionCode, cfg)
|
versionDataLoaders[serv.VersionCode] = dataloader.NewVersionDataLoader(serv.VersionCode, cfg)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ctx = StoreServerDataLoadersInContext(ctx, serverDataLoaders)
|
ctx = StoreServerDataLoadersInContext(ctx, serverDataLoaders)
|
||||||
ctx = StoreVersionDataLoadersInContext(ctx, versionDataLoaders)
|
ctx = StoreVersionDataLoadersInContext(ctx, versionDataLoaders)
|
||||||
ctx = StoreDataLoadersInContext(ctx, dataloaders.NewDataLoaders(cfg))
|
ctx = StoreDataLoaderInContext(ctx, dataloader.NewDataLoader(cfg))
|
||||||
c.Request = c.Request.WithContext(ctx)
|
c.Request = c.Request.WithContext(ctx)
|
||||||
c.Next()
|
c.Next()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func StoreServerDataLoadersInContext(ctx context.Context, loaders map[string]*dataloaders.ServerDataLoaders) context.Context {
|
func StoreServerDataLoadersInContext(ctx context.Context, loaders map[string]*dataloader.ServerDataLoader) context.Context {
|
||||||
return context.WithValue(ctx, serverDataLoadersContextKey, loaders)
|
return context.WithValue(ctx, serverDataLoadersContextKey, loaders)
|
||||||
}
|
}
|
||||||
|
|
||||||
func ServerDataLoadersFromContext(ctx context.Context) map[string]*dataloaders.ServerDataLoaders {
|
func ServerDataLoadersFromContext(ctx context.Context) map[string]*dataloader.ServerDataLoader {
|
||||||
dl := ctx.Value(serverDataLoadersContextKey)
|
dl := ctx.Value(serverDataLoadersContextKey)
|
||||||
if dl == nil {
|
if dl == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
return dl.(map[string]*dataloaders.ServerDataLoaders)
|
return dl.(map[string]*dataloader.ServerDataLoader)
|
||||||
}
|
}
|
||||||
|
|
||||||
func StoreVersionDataLoadersInContext(ctx context.Context, loaders map[twmodel.VersionCode]*dataloaders.VersionDataLoaders) context.Context {
|
func StoreVersionDataLoadersInContext(ctx context.Context, loaders map[twmodel.VersionCode]*dataloader.VersionDataLoader) context.Context {
|
||||||
return context.WithValue(ctx, versionLoadersContextKey, loaders)
|
return context.WithValue(ctx, versionDataLoadersContextKey, loaders)
|
||||||
}
|
}
|
||||||
|
|
||||||
func VersionDataLoadersFromContext(ctx context.Context) map[twmodel.VersionCode]*dataloaders.VersionDataLoaders {
|
func VersionDataLoadersFromContext(ctx context.Context) map[twmodel.VersionCode]*dataloader.VersionDataLoader {
|
||||||
dl := ctx.Value(versionLoadersContextKey)
|
dl := ctx.Value(versionDataLoadersContextKey)
|
||||||
if dl == nil {
|
if dl == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
return dl.(map[twmodel.VersionCode]*dataloaders.VersionDataLoaders)
|
return dl.(map[twmodel.VersionCode]*dataloader.VersionDataLoader)
|
||||||
}
|
}
|
||||||
|
|
||||||
func StoreDataLoadersInContext(ctx context.Context, loaders *dataloaders.DataLoaders) context.Context {
|
func StoreDataLoaderInContext(ctx context.Context, loaders *dataloader.DataLoader) context.Context {
|
||||||
return context.WithValue(ctx, dataloadersContextKey, loaders)
|
return context.WithValue(ctx, dataLoaderContextKey, loaders)
|
||||||
}
|
}
|
||||||
|
|
||||||
func DataLoadersFromContext(ctx context.Context) *dataloaders.DataLoaders {
|
func DataLoaderFromContext(ctx context.Context) *dataloader.DataLoader {
|
||||||
dl := ctx.Value(dataloadersContextKey)
|
dl := ctx.Value(dataLoaderContextKey)
|
||||||
if dl == nil {
|
if dl == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
return dl.(*dataloaders.DataLoaders)
|
return dl.(*dataloader.DataLoader)
|
||||||
}
|
}
|
||||||
|
|
Reference in New Issue