Service Per Business Capability Pattern :👈 👉:Database per Service Pattern

Asynchronous Messaging Pattern

Asynchronous Messaging Pattern

Asynchronous Messaging is a communication pattern where messages are sent between components without waiting for an immediate response.

Asynchronous Messaging in Microservices

Asynchronous Messaging is a communication style where one microservice sends a message to another service without waiting for an immediate response.

Instead of:

Service A ---> Service B ---> Response
       (Wait)

the sender publishes a message and continues its work:

Service A ---> Message Queue ---> Service B
Service A does not wait.

Simple Definition

Asynchronous Messaging allows microservices to communicate by exchanging messages through a message broker (RabbitMQ, Kafka, Azure Service Bus, etc.) without being directly dependent on each other's availability.

Why Do We Need It?

Imagine an E-Commerce application.

When a customer places an order, multiple actions are required:

  1. Create Order
  2. Process Payment
  3. Update Inventory
  4. Generate Invoice
  5. Send Email
  6. Notify Shipping Team

If we use synchronous communication:

Order Service
      │
      ├── Payment Service
      ├── Inventory Service
      ├── Invoice Service
      ├── Email Service
      └── Shipping Service

Order Service waits for every service.

Problems:

  • Slow response
  • Service dependency
  • Failure propagation
  • Reduced scalability

Asynchronous Messaging Solution

                 RabbitMQ / Kafka
                        │
                        ▼
Order Service ---> OrderCreated Event
                        │
      ┌─────────────────┼────────────────┐
      │                 │                │
      ▼                 ▼                ▼
Payment Service   Inventory Service   Email Service

Order Service publishes an event and immediately responds.

"Order Created Successfully"

Other services process the event independently.

Real-Life Analogy

Think of sending an email.

Synchronous Communication

You call your friend.
You wait until he answers.

Asynchronous Communication

You send an email.
Continue your work.
Friend reads it later.

This is exactly how asynchronous messaging works.

Components of Asynchronous Messaging

1. Producer

The service that sends messages.

Example:

Order Service

Produces:

OrderCreated Event

2. Message Broker

Stores and routes messages.

Popular Brokers:

  • RabbitMQ
  • Apache Kafka
  • Azure Service Bus
  • AWS SQS
  • ActiveMQ

3. Consumer

Service that receives messages.

Example:

Payment Service
Inventory Service
Notification Service

Example Flow

Customer places order:

Customer
    │
    ▼
Order Service
    │
    ▼
Publish OrderCreated Event
    │
    ▼
RabbitMQ
    │
 ┌──┼─────────────┬───────────┐
 │  │             │           │
 ▼  ▼             ▼           ▼
Payment      Inventory     Notification
Service      Service       Service

Each service reacts independently.

.NET Example Using RabbitMQ

Step 1: Create Event Class

Shared contract:

public class OrderCreatedEvent
{
    public int OrderId { get; set; }
    public int CustomerId { get; set; }
    public decimal Amount { get; set; }
}

Step 2: Order Service Publishes Event

Install:

MassTransit
MassTransit.RabbitMQ

Publish event:

public class OrderService
{
    private readonly IPublishEndpoint _publishEndpoint;
    public OrderService(IPublishEndpoint publishEndpoint)
    {
        _publishEndpoint = publishEndpoint;
    }
    public async Task CreateOrder()
    {
        var order = new Order
        {
            Id = 1001,
            CustomerId = 10,
            Amount = 500
        };
        await _publishEndpoint.Publish(
            new OrderCreatedEvent
            {
                OrderId = order.Id,
                CustomerId = order.CustomerId,
                Amount = order.Amount
            });
        Console.WriteLine("Event Published");
    }
}

Order Service finishes immediately after publishing.

Step 3: Payment Service Consumes Event

public class OrderCreatedConsumer :
    IConsumer<OrderCreatedEvent>
{
    public async Task Consume(
        ConsumeContext<OrderCreatedEvent> context)
    {
        var message = context.Message;
        Console.WriteLine(
            $"Processing payment for Order {message.OrderId}");
        await Task.CompletedTask;
    }
}

Step 4: Register Consumer

builder.Services.AddMassTransit(x =>
{
    x.AddConsumer<OrderCreatedConsumer>();
    x.UsingRabbitMq((context, cfg) =>
    {
        cfg.Host("localhost");
        cfg.ReceiveEndpoint("payment-queue", e =>
        {
            e.ConfigureConsumer<OrderCreatedConsumer>(context);
        });
    });
});

Event-Driven Communication

Asynchronous Messaging is often implemented using Events.

Examples:

OrderCreated
PaymentCompleted
ProductAdded
InventoryUpdated
CustomerRegistered

Publisher:

Order Service

Event:

OrderCreated

Subscribers:

Payment Service
Shipping Service
Email Service

Before and After

Synchronous

Order Service
      │
      ▼
Payment Service
      │
      ▼
Inventory Service
      │
      ▼
Email Service

Total Time:

500ms + 600ms + 800ms
= 1900ms

Order waits for everything.

Asynchronous

Order Service
      │
      ▼
Publish Event
Response sent immediately

Total Time:

100ms

Other services continue later.

Benefits

1. Loose Coupling

Services are independent.

Order Service doesn't know
who processes the event.

2. Better Performance

User receives response faster.

Order Created Successfully

without waiting for emails or shipping.

3. Better Scalability

Example:

Payment Service
    10 Instances
Email Service
    2 Instances

Each service scales independently.

4. Fault Tolerance

Suppose Email Service is down.

Order Service → Working
Payment Service → Working
Inventory Service → Working
Email Service → Down

Messages remain in the queue until Email Service becomes available.

5. Event-Driven Architecture

Supports modern patterns:

  • Event Sourcing
  • CQRS
  • Saga Pattern
  • Distributed Workflows

Challenges

Message Duplication

Sometimes the same message may be processed more than once.

Example:

OrderCreated
OrderCreated

Solution:

Idempotency

Process the same event safely multiple times.

Eventual Consistency

Data is not updated instantly across services.

Example:

Order Created
Inventory updates after 2 seconds

Temporary differences may exist.

Debugging Complexity

Request flow becomes:

Order Service
   ↓
RabbitMQ
   ↓
Payment Service
   ↓
Inventory Service

Distributed tracing tools are needed.

Common Message Brokers

Broker Usage
RabbitMQ Most popular for .NET microservices
Kafka High-volume event streaming
Azure Service Bus Microsoft cloud environments
AWS SQS AWS applications
ActiveMQ Enterprise messaging

Interview Answer

Asynchronous Messaging is a communication pattern in microservices where services exchange messages through a message broker without waiting for an immediate response. The sender publishes an event or message and continues processing, while consumer services handle the message independently. This approach improves scalability, fault tolerance, performance, and loose coupling. Common implementations in .NET use RabbitMQ, Azure Service Bus, Kafka, and MassTransit.

Back to Index
Service Per Business Capability Pattern :👈 👉:Database per Service Pattern