Skip to content

Widhian Bramantya

coding is an art form

Menu
  • About Me
Menu
nats

Publish–Subscribe in NATS: Simple and Powerful Messaging

Posted on September 6, 2025September 6, 2025 by admin

In the previous article, I wrote an overview of NATS and NATS JetStream. Before we go deeper into advanced topics like scalability and reliability, it’s important to understand the most common messaging pattern in NATS: Publish–Subscribe.

What is Publish–Subscribe?

Publish–Subscribe (or pub/sub) is a way of sending messages where:

  • Publishers send messages to a subject.
  • Subscribers listen to that subject.
  • Publishers don’t know who the subscribers are.
  • Subscribers don’t know where the messages come from.

It’s a decoupled system: the publisher just fires a message, and anyone who is interested can subscribe and receive it.

Pub/Sub in NATS

In NATS, everything revolves around subjects. A subject is like a channel or a topic.

  • A publisher publishes a message to a subject.
  • A subscriber subscribes to that subject and receives the message in real time.

Example:

// Publisher
nc.Publish("updates", []byte("Hello subscribers!"))

// Subscriber
nc.Subscribe("updates", func(msg *nats.Msg) {
    fmt.Printf("Received: %s\n", string(msg.Data))
})

When the publisher sends "Hello subscribers!", all subscribers of updates will get that message instantly.

Using Wildcards

NATS subjects support wildcards, which makes pub/sub flexible.

  • * matches one token.
  • > matches one or more tokens.

Example:

  • orders.* → matches orders.created, orders.paid, but not orders.created.new.
  • orders.> → matches everything that starts with orders.

This is useful when you want to organize your events with patterns.

Real-World Examples

1. Order Processing

  • Subjects:
    • orders.created
    • orders.shipped
  • Services can subscribe only to the events they care about. For example, the shipping service subscribes to orders.created.

2. Chat Application

  • Subject: chat.room1
  • Every user in room1 subscribes to chat.room1.
  • Messages are instantly broadcast to everyone in that room.

3. System Monitoring

  • Subject: metrics.cpu.usage
  • Monitoring tools subscribe to all metrics using metrics.>.
  • This way, they receive all metrics without needing separate subscriptions for each one.
See also  Scalability and Reliability in NATS
Pages: 1 2
Category: NATS

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

Linkedin

Widhian Bramantya

Recent Posts

  • Log Management at Scale: Integrating Elasticsearch with Beats, Logstash, and Kibana
  • Index Lifecycle Management (ILM) in Elasticsearch: Automatic Data Control Made Simple
  • Blue-Green Deployment in Elasticsearch: Safe Reindexing and Zero-Downtime Upgrades
  • Maintaining Super Large Datasets in Elasticsearch
  • Elasticsearch Best Practices for Beginners
  • Implementing the Outbox Pattern with Debezium
  • Production-Grade Debezium Connector with Kafka (Postgres Outbox Example – E-Commerce Orders)
  • Connecting Debezium with Kafka for Real-Time Streaming
  • Debezium Architecture – How It Works and Core Components
  • What is Debezium? – An Introduction to Change Data Capture
  • Offset Management and Consumer Groups in Kafka
  • Partitions, Replication, and Fault Tolerance in Kafka
  • Delivery Semantics in Kafka: At Most Once, At Least Once, Exactly Once
  • Producers and Consumers: How Data Flows in Kafka
  • Kafka Architecture Explained: Brokers, Topics, Partitions, and Offsets
  • Getting Started with Apache Kafka: Core Concepts and Use Cases
  • Security Best Practices for RabbitMQ in Production
  • Understanding RabbitMQ Virtual Hosts (vhosts) and Their Uses
  • RabbitMQ Performance Tuning: Optimizing Throughput and Latency
  • High Availability in RabbitMQ: Clustering and Mirrored Queues Explained

Recent Comments

  1. Playing with VPC AWS (Part 2) – Widhian's Blog on Playing with VPC AWS (Part 1): VPC, Subnet, Internet Gateway, Route Table, NAT, and Security Group
  2. Basic Concept of ElasticSearch (Part 3): Translog, Flush, and Refresh – Widhian's Blog on Basic Concept of ElasticSearch (Part 1): Introduction
  3. Basic Concept of ElasticSearch (Part 2): Architectural Perspective – Widhian's Blog on Basic Concept of ElasticSearch (Part 3): Translog, Flush, and Refresh
  4. Basic Concept of ElasticSearch (Part 3): Translog, Flush, and Refresh – Widhian's Blog on Basic Concept of ElasticSearch (Part 2): Architectural Perspective
  5. Basic Concept of ElasticSearch (Part 1): Introduction – Widhian's Blog on Basic Concept of ElasticSearch (Part 2): Architectural Perspective

Archives

  • October 2025
  • September 2025
  • August 2025
  • November 2021
  • October 2021
  • August 2021
  • July 2021
  • June 2021
  • March 2021
  • January 2021

Categories

  • Debezium
  • Devops
  • ElasticSearch
  • Golang
  • Kafka
  • Lua
  • NATS
  • Programming
  • RabbitMQ
  • Redis
  • VPC
© 2025 Widhian Bramantya | Powered by Minimalist Blog WordPress Theme