Description
Problem:
Inefficient microservice/database queries.
If I need to return 100 orders with their clients, I have to make 101 requests to microservices (1 for batch of orders, 100 for their clients (one per each order)).
Scheme (simplified):
type Query {
orders: [Order]
}
type Order {
id: ID
client: Client
}
type Client {
id: ID
name: String
}
Query:
query GetOrders {
orders {
client {
name
}
}
}
Resolvers:
func (r *Resolver) Orders() []*orderResolver {
data, err := Request(orderService, "Order.List", &Args{}) // returns batch
...
return // batch of 100 order resolvers
}
// 100 client resolvers - 100 requests
func (r *orderResolver) Client() *clientResolver {
data, err := Request(clientService, "Client.Get",&Args{) // returns one
...
return // a client resolver
}
Instead, I'd like to know (in the order resolver) that the field with clients has been requested.
So I could make one batch request at the order resolver level.
Something like this:
func (r *Resolver) Orders(ctx context.Context) []*orderResolver {
data, err := Request(orderService, "Order.List", &Args{}) // returns batch
if ctx.Value("fields")... {
clients, err := Request(clientService, "Client.List",&Args{) // batch
}
...
return // batch of 100 order resolvers witch clients inside
}
So I get 2 request.
Metadata
Metadata
Assignees
Labels
No labels