DevOps

How to Implement GraphQL Subscriptions in Real-Time Chat Applications

Lisa Anderson

Lisa Anderson

August 28, 2026

How to Implement GraphQL Subscriptions in Real-Time Chat Applications

How to Implement GraphQL Subscriptions in Real-Time Chat Applications

Real-time chat applications require efficient and scalable communication between clients and servers. GraphQL subscriptions offer a powerful solution for this, allowing for bidirectional communication and event-driven updates. In this tutorial, you will learn how to implement GraphQL subscriptions in a Node.js backend with Apollo Server and React frontend with Apollo Client.

Why Use GraphQL Subscriptions?

Traditional HTTP requests are not suitable for real-time applications because they require a full page reload or polling. GraphQL subscriptions enable real-time updates by establishing a persistent connection between the client and server. This reduces latency and improves the user experience.

Setting Up the Backend with Apollo Server

First, ensure you have Node.js and npm installed. Then, create a new project:


npm init -y
npm install apollo-server graphql

Creating a Subscription Resolver

Define a subscription resolver in your GraphQL schema:


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

const typeDefs = gql`
  type Subscription {
    messageAdded: Message!
  }

  type Message {
    id: ID!
    content: String!
    author: String!
    timestamp: String!
  }
`

const resolvers = {
  Subscription: {
    messageAdded: {
      subscribe: () => {
        return new ApolloServer.ApolloSubscriptionServer({
          onConnect: (connectionParams, ws) => {
            console.log('Client connected')
          },
          onDisconnect: (id) => {
            console.log('Client disconnected')
          },
          forwardTo: ['ws://localhost:8080']
        })
      }
    }
  }
}

const server = new ApolloServer({ typeDefs, resolvers })
server.listen().then(({ url }) => {
  console.log(`🚀 Server ready at ${url}`)
})

Setting Up the Frontend with Apollo Client

Install Apollo Client and other necessary dependencies:


npm install apollo-client apollo-link-http apollo-cache-inmemory react-apollo graphql

Creating a Subscription Component

Create a React component to subscribe to new messages:


import React from 'react'
import { ApolloProvider, useQuery, useSubscription } from '@apollo/react-hooks'
import { ApolloClient, InMemoryCache } from '@apollo/client'
import { gql } from 'graphql-tag'

const client = new ApolloClient({
  cache: new InMemoryCache(),
  uri: 'http://localhost:4000/graphql'
})

const MessageSubscription = () => {
  const { data } = useSubscription(gql`
    subscription {
      messageAdded {
        id
        content
        author
        timestamp
      }
    }
  `)

  return (
    <div>
      {data ? data.messageAdded.map(message => (
        <p>{message.author}: {message.content} ({message.timestamp})</p>
      )) : <p>Waiting for new messages...</p>}
    </div>
  )
}

export default () => (
  <ApolloProvider client={client}>
    <MessageSubscription />
  </ApolloProvider>
)

Handling Edge Cases and Performance Considerations

Consider these best practices:

  • Implement error handling for subscription failures
  • Use optimistic responses to provide a better user experience
  • Limit the number of concurrent subscriptions to prevent server overload

For example, add error handling in the subscription resolver:


const resolvers = {
  Subscription: {
    messageAdded: {
      subscribe: () => {
        return new ApolloServer.ApolloSubscriptionServer({
          onConnect: (connectionParams, ws) => {
            console.log('Client connected')
          },
          onDisconnect: (id) => {
            console.log('Client disconnected')
          },
          forwardTo: ['ws://localhost:8080'],
          onError: (error) => {
            console.error('Subscription error:', error)
          }
        })
      }
    }
  }
}

Conclusion

  • GraphQL subscriptions are essential for real-time applications
  • Implementing them requires setting up both backend and frontend components
  • Follow best practices to ensure a smooth user experience

Now you can build real-time chat applications with GraphQL subscriptions. Explore more advanced features like authentication and authorization to secure your application.

Lisa Anderson

Written by

Lisa Anderson

A passionate developer sharing insights and experiences in web development, design, and modern technologies.