Skip to content

Widhian Bramantya

coding is an art form

Menu
  • About Me
Menu
nats

Queue Groups in NATS: Load Balancing for Subscribers

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

In the previous articles, we looked at Publish–Subscribe and Request–Reply patterns in NATS. Pub/Sub is great for broadcasting messages to many subscribers, while Request–Reply is perfect for one-to-one communication. But what if you want to distribute messages across a group of workers so that only one of them processes each message?

This is where Queue Groups come in.

What are Queue Groups?

A Queue Group is a way to make multiple subscribers share the work for the same subject. Instead of all subscribers getting every message, each message is delivered to only one member of the group.

  • Publishers don’t need to know about the group.
  • Subscribers just join the same queue group by giving it a name.
  • NATS automatically balances the messages among them.

Example in Go

Publisher:

nc.Publish("jobs", []byte("process this task"))

Subscribers in a Queue Group:

// Worker A
nc.QueueSubscribe("jobs", "workers", func(msg *nats.Msg) {
    fmt.Println("Worker A got:", string(msg.Data))
})

// Worker B
nc.QueueSubscribe("jobs", "workers", func(msg *nats.Msg) {
    fmt.Println("Worker B got:", string(msg.Data))
})

If the publisher sends 10 messages to jobs, NATS will spread them between Worker A and Worker B. Each message will only be delivered once to one worker.

Why Use Queue Groups?

  1. Load Balancing
    • Multiple workers can share the load of incoming tasks.
    • Example: background jobs, image processing, or notification sending.
  2. High Availability
    • If one worker goes down, the others in the group continue processing.
    • This reduces downtime and increases reliability.
  3. Horizontal Scaling
    • You can add more subscribers to the queue group to handle higher traffic.
    • No need to change publishers — they keep sending to the same subject.
See also  Ensuring Message Ordering in NATS: A Kafka-like Approach
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