As modern applications grow more complex, handling communication between services efficiently becomes critical. One powerful pattern that helps with this is pub/sub messaging in NestJS, enabling seamless and scalable service communication.
In this post, I’ll walk you through what Pub/Sub is, why it matters, and how you can integrate it cleanly into your NestJS applications.
What is Pub/Sub?
At its core, the Pub/Sub model decouples the sender (publisher) of a message from the receiver (subscriber).
Instead of a direct call between two services, the publisher simply publishes a message to a topic, and any number of subscribers listen for that message.
This brings several benefits:
- Loose coupling between components
- Easy scaling of consumers
- Resilience in distributed systems
- Event-driven architecture support
Popular implementations include Google Cloud Pub/Sub, AWS SNS/SQS, Kafka, and Redis Pub/Sub.
Why Use Pub/Sub in NestJS?
NestJS, with its modular and scalable design, fits perfectly with Pub/Sub systems.
Using Pub/Sub in NestJS allows you to:
- Trigger workflows asynchronously
- Build microservices or event-driven systems
- Improve reliability and responsiveness of your app
Whether you’re handling user sign-ups, order processing, or notification systems, Pub/Sub can simplify your backend communication.
Setting Up Pub/Sub in a NestJS Project
Let’s dive into a simple example using Google Cloud Pub/Sub.
The ideas are very similar even if you use other services.
1. Install the Necessary Packages
First, add the official Google Pub/Sub client:
npm install @google-cloud/pubsub
Make sure you have credentials set up (like GOOGLE_APPLICATION_CREDENTIALS).
2. Create a PubSub Service
Let’s create a simple service that can publish and subscribe to messages.
// pubsub.service.ts
import { Injectable, OnModuleInit } from '@nestjs/common';
import { PubSub } from '@google-cloud/pubsub';
@Injectable()
export class PubSubService implements OnModuleInit {
private pubSubClient: PubSub;
async onModuleInit() {
this.pubSubClient = new PubSub();
}
async publishMessage(topicName: string, data: Record<string, any>) {
const topic = this.pubSubClient.topic(topicName);
const dataBuffer = Buffer.from(JSON.stringify(data));
await topic.publish(dataBuffer);
}
async subscribeToTopic(subscriptionName: string, handler: (message: any) => void) {
const subscription = this.pubSubClient.subscription(subscriptionName);
subscription.on('message', (message) => {
const data = JSON.parse(message.data.toString());
handler(data);
message.ack();
});
subscription.on('error', (error) => {
console.error('Subscription error:', error);
});
}
}
3. Use the PubSub Service
In any module, you can inject and use it:
//app.service.ts
import { Injectable } from '@nestjs/common';
import { PubSubService } from './pubsub.service';
@Injectable()
export class AppService {
constructor(private readonly pubSubService: PubSubService) {}
async sendNotification() {
await this.pubSubService.publishMessage('user-notifications', { userId: 123, message: 'Welcome!' });
}
async listenForEvents() {
await this.pubSubService.subscribeToTopic('user-notifications-sub', (data) => {
console.log('Received event data:', data);
});
}
}
You could trigger listenForEvents() when your app starts, or attach it to a background job.
Best Practices for Pub/Sub in NestJS
- Acknowledge messages properly to avoid reprocessing.
- Handle retries and dead-letter topics for failed messages.
- Use DTOs (Data Transfer Objects) to validate incoming data from messages.
- Add logging around message publishing and receiving for easier debugging.
- Secure your topics and subscriptions — don’t leave them public!
- Gracefully shut down subscriptions when the app stops.
Conclusion
Implementing Pub/Sub messaging in your NestJS applications can make them more scalable, resilient, and responsive.
Instead of direct calls between services, Pub/Sub lets you build event-driven systems that react to changes naturally.
Start small — publish a few events, subscribe to them, and watch how easily you can decouple and scale your systems.
The future of backend architecture is event-driven, and NestJS with Pub/Sub gives you the tools to be ready for it.
Finally, for more such updates and to read more about such topics, please follow our LinkedIn page Frontend Competency.