WebSocket transport in GraphQL - Time & Space Complexity
When using WebSocket transport in GraphQL, we want to understand how the time to handle messages grows as more data or clients connect.
We ask: How does the work increase when more messages or subscriptions happen?
Analyze the time complexity of the following GraphQL subscription over WebSocket.
subscription OnMessageReceived {
messageReceived {
id
content
sender
}
}
This subscription listens for new messages sent to the server and pushes them to clients over WebSocket.
Look for repeated actions that affect time.
- Primary operation: Sending each new message to all subscribed clients.
- How many times: Once per message, repeated for each client subscribed.
As the number of clients or messages grows, the work grows too.
| Input Size (n = clients) | Approx. Operations (sending messages) |
|---|---|
| 10 | 10 sends per message |
| 100 | 100 sends per message |
| 1000 | 1000 sends per message |
Pattern observation: The work grows linearly with the number of subscribed clients.
Time Complexity: O(n)
This means the time to send messages grows directly with the number of clients connected.
[X] Wrong: "Sending a message to all clients takes the same time no matter how many clients there are."
[OK] Correct: Each client needs its own message sent, so more clients mean more work.
Understanding how WebSocket message delivery scales helps you explain real-time data flow in apps clearly and confidently.
What if the server batches messages before sending? How would that affect the time complexity?
Practice
Solution
Step 1: Understand WebSocket transport purpose
WebSocket transport maintains a continuous connection between client and server.Step 2: Connect with GraphQL subscriptions
This live connection allows instant data updates, which is the main benefit for subscriptions.Final Answer:
It keeps a live connection for real-time data updates. -> Option CQuick Check:
WebSocket = live real-time updates [OK]
- Confusing WebSocket with data storage
- Thinking it converts queries automatically
- Assuming it compresses data
Solution
Step 1: Identify the correct WebSocket URL scheme
WebSocket URLs start with 'ws://' or 'wss://' for secure connections.Step 2: Check the options
Only const ws = new WebSocket('ws://example.com/graphql'); uses 'ws://' which is the correct scheme for WebSocket connections.Final Answer:
const ws = new WebSocket('ws://example.com/graphql'); -> Option AQuick Check:
WebSocket URL starts with ws:// [OK]
- Using http:// instead of ws://
- Using ftp:// or file:// which are invalid for WebSocket
- Confusing secure ws with http
const subscription = client.subscribe({ query: MESSAGE_SUBSCRIPTION });
subscription.subscribe({
next(data) { console.log(data); },
error(err) { console.error(err); }
});Solution
Step 1: Understand the subscription method
The client.subscribe returns an observable that listens for new data.Step 2: Analyze the subscribe callback
The next callback logs incoming data, so when a new message arrives, it prints it.Final Answer:
Logs the new message data to the console. -> Option DQuick Check:
Subscription next callback logs data [OK]
- Thinking subscribe is not a function
- Assuming subscription needs manual start
- Expecting immediate error without cause
const ws = new WebSocket('http://example.com/graphql');
const subscription = client.subscribe({ query: SUBSCRIPTION_QUERY });
subscription.subscribe({
next(data) { console.log(data); },
error(err) { console.error(err); }
});Solution
Step 1: Check the WebSocket URL scheme
The URL uses 'http://' which is incorrect for WebSocket connections; it should be 'ws://'.Step 2: Verify other parts
Subscription query and callbacks are correctly used; no missing variables or double subscribe calls.Final Answer:
WebSocket URL uses 'http://' instead of 'ws://'. -> Option BQuick Check:
WebSocket URL must start with ws:// [OK]
- Ignoring URL scheme errors
- Assuming variables are always required
- Confusing subscribe method usage
Solution
Step 1: Understand real-time update needs
Live chat requires instant updates with minimal delay and server load.Step 2: Evaluate options for efficiency
Using WebSocket with filtered subscriptions sends only needed messages, reducing unnecessary data and load.Step 3: Compare alternatives
Polling wastes resources; sending all messages to all clients is inefficient; reconnecting often adds overhead.Final Answer:
Use WebSocket transport with filtered subscriptions to send only relevant messages to each client. -> Option AQuick Check:
Filtered WebSocket subscriptions = efficient real-time updates [OK]
- Using polling instead of WebSocket
- Broadcasting all messages to all clients
- Reconnecting WebSocket too frequently
Ready to prove it?
Pass the test and this pattern moves unknown
