Bird
Raised Fist0
GraphQLquery~10 mins

Gateway composition in GraphQL - Step-by-Step Execution

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Concept Flow - Gateway composition
Client sends query
Gateway receives query
Gateway splits query into subqueries
Send subqueries to respective services
Services process subqueries
Services return partial results
Gateway merges partial results
Gateway returns combined result to client
The gateway receives a client query, splits it into parts for different services, collects their responses, merges them, and sends back a single combined result.
Execution Sample
GraphQL
query {
  user(id: "1") {
    name
    posts {
      title
    }
  }
}
A client requests a user’s name and their posts’ titles; the gateway splits this to user and post services and combines the results.
Execution Table
StepActionQuery/ResponseServiceResult
1Receive full query{ user(id: "1") { name posts { title } } }GatewayFull query received
2Split query{ user(id: "1") { name } }GatewayUser subquery created
3Split query{ posts(userId: "1") { title } }GatewayPost subquery created
4Send subquery{ user(id: "1") { name } }User ServiceRequest sent
5Send subquery{ posts(userId: "1") { title } }Post ServiceRequest sent
6Receive response{ name: "Alice" }User ServiceUser data received
7Receive response{ posts: [{ title: "Hello World" }, { title: "GraphQL Rocks" }] }Post ServicePost data received
8Merge responses{ user: { name: "Alice", posts: [{ title: "Hello World" }, { title: "GraphQL Rocks" }] } }GatewayCombined result created
9Return combined result{ user: { name: "Alice", posts: [{ title: "Hello World" }, { title: "GraphQL Rocks" }] } }GatewayResult sent to client
10EndQuery completed
💡 All subqueries processed and merged; final combined result returned to client.
Variable Tracker
VariableStartAfter Step 2After Step 3After Step 6After Step 7Final
fullQuerynull{ user(id: "1") { name posts { title } } }{ user(id: "1") { name posts { title } } }{ user(id: "1") { name posts { title } } }{ user(id: "1") { name posts { title } } }null
userSubquerynull{ user(id: "1") { name } }{ user(id: "1") { name } }{ name: "Alice" }{ name: "Alice" }{ name: "Alice" }
postSubquerynullnull{ posts(userId: "1") { title } }null{ posts: [{ title: "Hello World" }, { title: "GraphQL Rocks" }] }{ posts: [{ title: "Hello World" }, { title: "GraphQL Rocks" }] }
combinedResultnullnullnullnullnull{ user: { name: "Alice", posts: [{ title: "Hello World" }, { title: "GraphQL Rocks" }] } }
Key Moments - 3 Insights
Why does the gateway split the query into subqueries?
Because each service owns part of the data, the gateway splits the query so each service can handle its part independently, as shown in steps 2 and 3 of the execution_table.
How does the gateway combine results from different services?
After receiving partial results from services (steps 6 and 7), the gateway merges them into one combined response (step 8), so the client gets a single unified answer.
What happens if one service is slow or fails?
The gateway waits for all services to respond before merging. If a service is slow or fails, the gateway may delay or return an error. This is why step 9 only happens after all responses are received.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table, what query does the gateway send to the Post Service?
A{ user(id: "1") { name posts { title } } }
B{ posts(userId: "1") { title } }
C{ user(id: "1") { name } }
D{ posts { title } }
💡 Hint
Check step 3 and 5 in the execution_table where the post subquery is created and sent.
At which step does the gateway merge the partial results?
AStep 6
BStep 7
CStep 8
DStep 9
💡 Hint
Look for the step labeled 'Merge responses' in the execution_table.
If the user service returned no name, how would the combined result change?
AThe combined result would have user name as null or missing
BThe combined result would not include posts
CThe gateway would skip merging
DThe gateway would send an error to the client immediately
💡 Hint
Refer to variable_tracker's combinedResult and how partial results affect it.
Concept Snapshot
Gateway Composition in GraphQL:
- Gateway receives full client query
- Splits query into subqueries per service
- Sends subqueries to respective services
- Receives partial results
- Merges results into one response
- Returns combined data to client
Full Transcript
Gateway composition in GraphQL works by the gateway receiving a full client query. It then splits this query into smaller subqueries, each targeting a specific service responsible for part of the data. The gateway sends these subqueries to the respective services. Each service processes its subquery and returns partial results. The gateway waits for all responses, merges them into a single combined result, and sends this unified response back to the client. This process allows multiple services to work together seamlessly to fulfill a single client request.

Practice

(1/5)
1. What is the main purpose of gateway composition in GraphQL?
easy
A. To combine multiple GraphQL services into a single API endpoint
B. To create multiple endpoints for each service
C. To replace GraphQL with REST APIs
D. To disable client requests

Solution

  1. Step 1: Understand gateway composition

    Gateway composition merges several GraphQL services into one unified API.
  2. Step 2: Identify the main benefit

    This allows clients to send requests to a single endpoint instead of multiple services.
  3. Final Answer:

    To combine multiple GraphQL services into a single API endpoint -> Option A
  4. Quick Check:

    Gateway composition = single API endpoint [OK]
Hint: Gateway composition means one API endpoint for many services [OK]
Common Mistakes:
  • Thinking it creates multiple endpoints
  • Confusing with REST APIs
  • Believing it disables client requests
2. Which of the following is the correct way to initialize ApolloGateway with two services named 'users' and 'products'?
easy
A. ApolloGateway({ services: ['users', 'products'] })
B. new ApolloGateway(services: ['users', 'products'])
C. new ApolloGateway({ services: [{ name: 'users', url: 'http://users' }, { name: 'products', url: 'http://products' }] })
D. new ApolloGateway({ endpoints: ['users', 'products'] })

Solution

  1. Step 1: Recall ApolloGateway initialization syntax

    ApolloGateway expects an object with a 'services' array containing objects with 'name' and 'url'.
  2. Step 2: Match the correct syntax

    new ApolloGateway({ services: [{ name: 'users', url: 'http://users' }, { name: 'products', url: 'http://products' }] }) correctly uses new ApolloGateway with services array of objects including name and url.
  3. Final Answer:

    new ApolloGateway({ services: [{ name: 'users', url: 'http://users' }, { name: 'products', url: 'http://products' }] }) -> Option C
  4. Quick Check:

    ApolloGateway needs services array with name and url [OK]
Hint: Use services array with name and url objects in ApolloGateway [OK]
Common Mistakes:
  • Passing services as simple string array
  • Using 'endpoints' instead of 'services'
  • Omitting 'new' keyword
3. Given this ApolloGateway setup:
const gateway = new ApolloGateway({
  services: [
    { name: 'users', url: 'http://localhost:4001/graphql' },
    { name: 'products', url: 'http://localhost:4002/graphql' }
  ],
  __exposeQueryPlanExperimental: false
});
What will be the result if a client queries for a product's name and its owner's username?
medium
A. The gateway throws an error because __exposeQueryPlanExperimental is false
B. The gateway returns data only from 'products' service ignoring 'users'
C. The gateway returns empty data because services are unreachable
D. The gateway fetches data from both 'products' and 'users' services and returns combined result

Solution

  1. Step 1: Understand gateway data fetching

    The gateway composes schemas and fetches data from all relevant services for the query.
  2. Step 2: Analyze the query involving product and user data

    Since the query asks for product and owner username, gateway calls both 'products' and 'users' services.
  3. Final Answer:

    The gateway fetches data from both 'products' and 'users' services and returns combined result -> Option D
  4. Quick Check:

    Gateway combines data from multiple services [OK]
Hint: Gateway merges data from all services needed by query [OK]
Common Mistakes:
  • Assuming gateway fetches from only one service
  • Confusing __exposeQueryPlanExperimental with data fetching
  • Assuming error without service failure
4. You wrote this ApolloGateway code but get an error:
const gateway = new ApolloGateway({
  services: [
    { name: 'users', url: 'http://localhost:4001/graphql' },
    { name: 'products' }
  ]
});
What is the likely cause of the error?
medium
A. Missing 'url' property for the 'products' service
B. Using 'services' instead of 'endpoints'
C. ApolloGateway requires only one service
D. The 'name' property should be 'serviceName'

Solution

  1. Step 1: Check service definitions

    Each service object must have both 'name' and 'url' properties.
  2. Step 2: Identify missing property

    The 'products' service lacks the 'url' property, causing the error.
  3. Final Answer:

    Missing 'url' property for the 'products' service -> Option A
  4. Quick Check:

    Each service needs name and url [OK]
Hint: Always include 'url' for each service in ApolloGateway [OK]
Common Mistakes:
  • Confusing 'services' with 'endpoints'
  • Thinking ApolloGateway supports single service only
  • Using wrong property names
5. You want to disable subscriptions in your ApolloGateway setup while composing three services. Which is the correct way to do this?
hard
A. Set subscriptions: false inside each service definition in ApolloGateway
B. Pass { subscriptions: false } in ApolloServer constructor, not in ApolloGateway
C. Add subscriptions: false in ApolloGateway constructor options
D. Disable subscriptions by removing the 'subscriptions' field from the schema

Solution

  1. Step 1: Understand where to disable subscriptions

    Subscriptions are disabled in ApolloServer, not ApolloGateway.
  2. Step 2: Apply correct configuration

    Pass { subscriptions: false } as an option to ApolloServer constructor wrapping the gateway.
  3. Final Answer:

    Pass { subscriptions: false } in ApolloServer constructor, not in ApolloGateway -> Option B
  4. Quick Check:

    Disable subscriptions in ApolloServer, not ApolloGateway [OK]
Hint: Disable subscriptions in ApolloServer, not ApolloGateway [OK]
Common Mistakes:
  • Trying to disable subscriptions inside ApolloGateway
  • Removing schema fields instead of config
  • Setting subscriptions false per service