0
0
GraphqlHow-ToBeginner · 4 min read

How to Implement Real Time Updates in GraphQL

To implement real time updates in GraphQL, use subscriptions which allow clients to listen for live data changes. Subscriptions work over WebSocket connections and send updates from the server to clients automatically when data changes.
📐

Syntax

A GraphQL subscription defines a real-time event stream that clients can subscribe to. It looks like a query but uses the subscription keyword. The server pushes data to clients when events occur.

  • subscription: keyword to define a subscription operation.
  • Event name: the subscription field that triggers updates.
  • Selection set: fields to receive in real-time updates.
graphql
subscription OnMessageAdded {
  messageAdded {
    id
    content
    author
  }
}
💻

Example

This example shows a simple GraphQL server using subscriptions with Apollo Server. It sends real-time messages to subscribed clients when a new message is added.

javascript
const { ApolloServer, gql, PubSub } = require('apollo-server');

const pubsub = new PubSub();
const MESSAGE_ADDED = 'MESSAGE_ADDED';

const typeDefs = gql`
  type Message {
    id: ID!
    content: String!
    author: String!
  }

  type Query {
    messages: [Message!]
  }

  type Subscription {
    messageAdded: Message
  }

  type Mutation {
    addMessage(content: String!, author: String!): Message
  }
`;

const messages = [];

const resolvers = {
  Query: {
    messages: () => messages,
  },
  Mutation: {
    addMessage: (parent, { content, author }) => {
      const message = { id: messages.length + 1, content, author };
      messages.push(message);
      pubsub.publish(MESSAGE_ADDED, { messageAdded: message });
      return message;
    },
  },
  Subscription: {
    messageAdded: {
      subscribe: () => pubsub.asyncIterator([MESSAGE_ADDED]),
    },
  },
};

const server = new ApolloServer({ typeDefs, resolvers });

server.listen().then(({ url }) => {
  console.log(`Server ready at ${url}`);
});
Output
Server ready at http://localhost:4000/
⚠️

Common Pitfalls

Common mistakes when implementing GraphQL subscriptions include:

  • Not setting up a WebSocket server to handle subscription connections.
  • Forgetting to publish events after data changes, so clients never receive updates.
  • Using subscriptions like queries without understanding they require persistent connections.
  • Not handling client reconnections or errors in the subscription stream.

Always ensure your server supports WebSocket and your client uses a subscription client library.

javascript
/* Wrong: Mutation does not publish event, so no updates sent */
addMessage: (parent, { content, author }) => {
  const message = { id: messages.length + 1, content, author };
  messages.push(message);
  return message; // Missing pubsub.publish
}

/* Right: Publish event after adding message */
addMessage: (parent, { content, author }) => {
  const message = { id: messages.length + 1, content, author };
  messages.push(message);
  pubsub.publish(MESSAGE_ADDED, { messageAdded: message });
  return message;
}
📊

Quick Reference

Key points for GraphQL subscriptions:

ConceptDescription
subscriptionDefines real-time data stream in GraphQL schema
PubSubPublish-subscribe system to send events from server to clients
WebSocketProtocol used for persistent connection for subscriptions
asyncIteratorMethod to create event stream for subscriptions
ClientMust use subscription client to listen for updates

Key Takeaways

Use GraphQL subscriptions with WebSocket to enable real-time updates.
Publish events on the server after data changes to notify subscribed clients.
Clients must maintain a persistent connection to receive live data.
Set up a PubSub system on the server to manage event broadcasting.
Handle connection errors and reconnections for reliable updates.