articles

home / developersection / articles / implement message queue in .net api

Implement Message Queue in .NET API

Implement Message Queue in .NET API

ICSM 34 03-Feb-2026

Introduction

Modern applications must handle high traffic, background processing, and integrations without slowing down APIs. A Message Queue (MQ) helps by decoupling services and processing tasks asynchronously.

In this article, we’ll understand:

  • What a message queue is
  • Why it’s needed in .NET APIs
  • Common queue options in .NET
  • How to implement a message queue using RabbitMQ (conceptually applicable to others)
Implement Message Queue in .NET API

What Is a Message Queue?

A message queue is a communication mechanism where:

  • Producers send messages
  • Consumers process messages
  • Messages are stored in a queue until processed

This allows APIs to respond quickly without waiting for long-running tasks.

Example use cases

  • Email sending
  • Notifications
  • Payment processing
  • Log processing
  • Bulk data operations

 

Why Use Message Queue in .NET API?

Problems Without Queue

  • API becomes slow
  • High traffic causes failures
  • Tight coupling between services
  • Difficult retry and error handling

Benefits With Queue

  • Asynchronous processing
  • Better scalability
  • Fault tolerance
  • Retry & dead-letter handling
  • Loose coupling between services

 

Common Message Queue Options in .NET

Queue Best For
RabbitMQ High performance, flexible routing
Azure Service Bus Cloud-native, enterprise
AWS SQS Serverless, managed
Kafka Event streaming, large scale
MSMQ Legacy Windows systems

For this article, we’ll use RabbitMQ, which is widely used with .NET APIs.

 

Architecture Overview

Client
  ↓
.NET API (Producer)
  ↓
Message Queue (RabbitMQ)
  ↓
Background Worker (Consumer)

Step 1: Install Required Packages

dotnet add package RabbitMQ.Client

Step 2: Create a Message Model

public class EmailMessage
{
    public string To { get; set; }
    public string Subject { get; set; }
    public string Body { get; set; }
}

Step 3: Implement Message Producer (API Side)

public class MessagePublisher
{
    private readonly IConnection _connection;
    private readonly IModel _channel;

    public MessagePublisher()
    {
        var factory = new ConnectionFactory()
        {
            HostName = "localhost"
        };

        _connection = factory.CreateConnection();
        _channel = _connection.CreateModel();

        _channel.QueueDeclare(
            queue: "email_queue",
            durable: true,
            exclusive: false,
            autoDelete: false
        );
    }

    public void Publish<T>(T message)
    {
        var body = Encoding.UTF8.GetBytes(
            JsonSerializer.Serialize(message)
        );

        _channel.BasicPublish(
            exchange: "",
            routingKey: "email_queue",
            basicProperties: null,
            body: body
        );
    }
}

Step 4: Use Queue in .NET API Controller

[ApiController]
[Route("api/email")]
public class EmailController : ControllerBase
{
    private readonly MessagePublisher _publisher;

    public EmailController()
    {
        _publisher = new MessagePublisher();
    }

    [HttpPost("send")]
    public IActionResult SendEmail(EmailMessage model)
    {
        _publisher.Publish(model);
        return Ok("Email queued successfully");
    }
}

Key point:
The API returns immediately without sending the email.

 

Step 5: Create Consumer (Background Worker)

Use Worker Service in .NET.

dotnet new worker -n EmailWorker

 

Consumer Implementation

protected override Task ExecuteAsync(CancellationToken stoppingToken)
{
    var factory = new ConnectionFactory() { HostName = "localhost" };
    var connection = factory.CreateConnection();
    var channel = connection.CreateModel();

    channel.QueueDeclare("email_queue", true, false, false);

    var consumer = new EventingBasicConsumer(channel);

    consumer.Received += (sender, e) =>
    {
        var message = Encoding.UTF8.GetString(e.Body.ToArray());
        var email = JsonSerializer.Deserialize<EmailMessage>(message);

        // Process email
        SendEmail(email);

        channel.BasicAck(e.DeliveryTag, false);
    };

    channel.BasicConsume("email_queue", false, consumer);

    return Task.CompletedTask;
}
Implement Message Queue in .NET API

Error Handling & Retry Strategy

Common Approaches

  • Retry with delay
  • Dead Letter Queue (DLQ)
  • Logging failed messages
  • Max retry count
email_queue → retry_queue → dead_letter_queue

 

Best Practices

  • Use durable queues
  • Acknowledge messages manually
  • Keep messages small
  • Avoid heavy logic in API layer
  • Use background workers
  • Monitor queue length
  • Add idempotency handling

 

When NOT to Use a Message Queue

 

Real-World Use Case Example

User Registration Flow

  • API creates user
  • Push message to queue
  • Worker sends welcome email
  • Worker logs analytics
  • Worker triggers notification

All without blocking the API.

Conclusion

Implementing a message queue in a .NET API improves performance, scalability, and reliability. By offloading heavy tasks to background consumers, your API stays fast and resilient.

Whether you use RabbitMQ, Azure Service Bus, or Kafka, the concept remains the same:

Produce fast, consume reliably.


c# .net  api(s) 
Updated 03-Feb-2026
ICSM

IT-Hardware & Networking

Ravi Vishwakarma is a dedicated Software Developer with a passion for crafting efficient and innovative solutions. With a keen eye for detail and years of experience, he excels in developing robust software systems that meet client needs. His expertise spans across multiple programming languages and technologies, making him a valuable asset in any software development project.


Message

Leave Comment

Comments

Liked By