Unsubscribing in GraphQL - Time & Space Complexity
When working with GraphQL subscriptions, it is important to understand how the time to unsubscribe grows as more subscriptions exist.
We want to know how the cost of stopping a subscription changes when there are many active subscriptions.
Analyze the time complexity of the following GraphQL unsubscribe operation.
mutation Unsubscribe($id: ID!) {
unsubscribe(subscriptionId: $id) {
success
message
}
}
This mutation stops a subscription by its unique ID, removing it from the active subscriptions list.
Look for loops or repeated checks during the unsubscribe process.
- Primary operation: Searching the list of active subscriptions to find the one with the matching ID.
- How many times: This search may check each subscription once until it finds the match.
As the number of active subscriptions grows, the time to find the one to unsubscribe grows too.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 checks |
| 100 | About 100 checks |
| 1000 | About 1000 checks |
Pattern observation: The number of operations grows roughly in direct proportion to the number of subscriptions.
Time Complexity: O(n)
This means the time to unsubscribe grows linearly with the number of active subscriptions.
[X] Wrong: "Unsubscribing always takes the same time no matter how many subscriptions exist."
[OK] Correct: Because the system usually searches through the list to find the subscription, more subscriptions mean more checks and longer time.
Understanding how unsubscribe operations scale helps you design efficient real-time systems and shows you can think about performance in practical ways.
"What if the subscriptions were stored in a map keyed by ID instead of a list? How would the time complexity change?"
Practice
What does calling unsubscribe() on a GraphQL subscription do?
Solution
Step 1: Understand the purpose of unsubscribe()
Theunsubscribe()method is designed to stop live updates from a GraphQL subscription.Step 2: Differentiate from other actions
It does not restart, delete permanently, or pause the subscription; it simply stops updates.Final Answer:
It stops receiving live updates from the subscription. -> Option DQuick Check:
Unsubscribe() stops updates = D [OK]
- Thinking unsubscribe() restarts the subscription
- Confusing unsubscribe() with deleting the subscription
- Assuming unsubscribe() only pauses updates
Which of the following is the correct syntax to stop a GraphQL subscription stored in variable sub?
const sub = client.subscribe({ query: MY_SUBSCRIPTION });
// Stop subscription here
Solution
Step 1: Identify the unsubscribe method on subscription object
The subscription object returned byclient.subscribe()has anunsubscribe()method to stop it.Step 2: Match correct syntax
Callingsub.unsubscribe();correctly stops the subscription. Other options are invalid method calls.Final Answer:
sub.unsubscribe(); -> Option CQuick Check:
Call unsubscribe() on subscription object = A [OK]
- Using unsubscribe() as a standalone function
- Calling stop() instead of unsubscribe()
- Trying to unsubscribe via client object
Given the code below, what will be logged after sub.unsubscribe() is called?
const sub = client.subscribe({ query: MY_SUBSCRIPTION });
sub.subscribe({
next(data) { console.log('Received:', data); },
error(err) { console.error('Error:', err); }
});
sub.unsubscribe();
// Later, server sends new data
Solution
Step 1: Understand unsubscribe effect on subscription callbacks
Callingunsubscribe()stops the subscription and prevents furthernextcallbacks.Step 2: Predict logging behavior after unsubscribe
Since subscription is stopped, no new data triggersconsole.log, so no logs appear after unsubscribe.Final Answer:
No logs will appear after unsubscribe is called. -> Option BQuick Check:
Unsubscribe stops callbacks = C [OK]
- Expecting data logs after unsubscribe
- Assuming unsubscribe triggers an error
- Thinking one last data event logs after unsubscribe
Identify the error in the code below that prevents unsubscribing correctly:
const subscription = client.subscribe({ query: NEW_MESSAGES });
subscription.next({
next(data) { console.log(data); }
});
subscription.unsubscribe();
Solution
Step 1: Check subscription method usage
The subscription object usessubscribe()to listen for data, notnext().Step 2: Identify correct method to receive data
Replacingsubscription.next()withsubscription.subscribe()fixes the issue and allows unsubscribe to work properly.Final Answer:
Usingsubscription.next()instead ofsubscription.subscribe(). -> Option AQuick Check:
Use subscribe(), not next(), to listen = B [OK]
- Calling next() instead of subscribe()
- Unsubscribing before subscribing
- Ignoring error callback (not critical here)
You have multiple active subscriptions stored in an array subs. How do you efficiently unsubscribe from all of them?
const subs = [sub1, sub2, sub3];
// Your code here
Solution
Step 1: Understand unsubscribing multiple subscriptions
Each subscription object has anunsubscribe()method to stop it individually.Step 2: Use array iteration to call unsubscribe on each
Usingsubs.forEach(s => s.unsubscribe());calls unsubscribe on all subscriptions efficiently.Final Answer:
subs.forEach(s => s.unsubscribe()); -> Option AQuick Check:
Call unsubscribe() on each subscription in array = A [OK]
- Calling unsubscribe() on the array itself
- Using stop() method which does not exist
- Trying to call unsubscribe() without iteration
Ready to prove it?
Pass the test and this pattern moves unknown
