Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Message Queue - Introduction

Overview

Message Queue là một architectural pattern cho phép các components giao tiếp với nhau một cách asynchronous thông qua messages. Trong hệ thống phân tán, message queues đóng vai trò thiết yếu trong việc decouple producers và consumers, đảm bảo reliable delivery và enable scaling.

┌─────────────────────────────────────────────────────────────────┐
│                    MESSAGE QUEUE ARCHITECTURE                  │
├─────────────────────────────────────────────────────────────────┤
│                                                                  │
│   Producer              Queue              Consumer             │
│       │                  │                    │                 │
│       │   ┌──────────┐   │                    │                 │
│       ├──▶│ Message  │──▶│                    │                 │
│       │   └──────────┘   │   ┌──────────┐    │                 │
│       │                  ├──▶│ Message  │───▶│                 │
│       │                  │   └──────────┘    │                 │
│       │                  │                    │                 │
│       │                  │   ┌──────────┐    │                 │
│       └──▶  (async) ────▶│──▶│ Message  │────│──▶ Process      │
│                          │   └──────────┘    │                 │
│                          │                    │                 │
│   Non-blocking           │                    │                 │
│   Reliable delivery       │                    │                 │
└─────────────────────────────────────────────────────────────────┘

Core Concepts

1. Producer

Component tạo và gửi messages vào queue.

// Producer sends message without waiting for processing
public class OrderService
{
    private readonly QueueClient _queueClient;
    
    public async Task CreateOrder(Order order)
    {
        var message = new QueueMessage
        {
            Body = BinaryData.FromObjectAsJson(order),
            MessageId = Guid.NewGuid().ToString()
        };
        
        // Fire and forget - non-blocking
        await _queueClient.SendMessageAsync(message);
        
        // Continue with other work immediately
        return order.Id;
    }
}

2. Queue

Buffer lưu trữ messages cho đến khi được xử lý.

┌─────────────────────────────────────────────────────────────────┐
│                         QUEUE STRUCTURE                        │
├─────────────────────────────────────────────────────────────────┤
│                                                                  │
│   ┌─────────────────────────────────────────────────────────┐  │
│   │  Message 1  │  Message 2  │  Message 3  │  Message N    │  │
│   │  (FIFO)     │  (FIFO)     │  (FIFO)     │  (FIFO)       │  │
│   └─────────────────────────────────────────────────────────┘  │
│                                                                  │
│   Properties:                                                   │
│   - Name: Unique identifier                                     │
│   - Size: Current message count                                 │
│   - TTL: Time-to-live for messages                              │
│   - VisibilityTimeout: Time message is invisible              │
└─────────────────────────────────────────────────────────────────┘

3. Consumer

Component nhận và xử lý messages từ queue.

// Consumer processes messages
public class OrderProcessor : BackgroundService
{
    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
            var messages = await _queueClient.ReceiveMessagesAsync(
                maxMessages: 10,
                visibilityTimeout: TimeSpan.FromMinutes(5));
            
            foreach (var message in messages.Value)
            {
                await ProcessMessageAsync(message);
                await _queueClient.DeleteMessageAsync(
                    message.MessageId, 
                    message.PopReceipt);
            }
        }
    }
}

Message Queue Benefits

BenefitDescription
DecouplingProducers và consumers không cần biết về nhau
ReliabilityMessages được lưu persistently cho đến khi processed
ScalabilityThêm consumers không ảnh hưởng producers
Load LevelingXử lý traffic spikes bằng cách queue messages
AsynchronousNon-blocking communication

Types of Message Queues

1. Point-to-Point

Một message chỉ được xử lý bởi một consumer.

┌─────────────────────────────────────────────────────────────────┐
│                   POINT-TO-POINT PATTERN                       │
├─────────────────────────────────────────────────────────────────┤
│                                                                  │
│   Producer                                                      │
│       │                                                         │
│       ├──▶ [Queue] ──▶ Consumer A                             │
│       │                                                         │
│       └──▶ [Queue] ──▶ Consumer B  (không nhận được)          │
│                                                                  │
│   Message chỉ được xử lý một lần                               │
└─────────────────────────────────────────────────────────────────┘

2. Pub/Sub (Publish-Subscribe)

Một message được gửi đến tất cả subscribers.

┌─────────────────────────────────────────────────────────────────┐
│                      PUB/SUB PATTERN                           │
├─────────────────────────────────────────────────────────────────┤
│                                                                  │
│   Publisher                                                     │
│       │                                                         │
│       ├──▶ [Topic] ──▶ Subscriber 1                            │
│       │                                                        │
│       ├──▶ [Topic] ──▶ Subscriber 2                            │
│       │                                                        │
│       └──▶ [Topic] ──▶ Subscriber 3                            │
│                                                                  │
│   Tất cả subscribers nhận được cùng message                    │
└─────────────────────────────────────────────────────────────────┘

When to Use Message Queue

Use CaseDescription
Order ProcessingXử lý đơn hàng asynchronously
Background JobsScheduled tasks, batch processing
Microservices CommunicationService-to-service messaging
Email/NotificationsAsync notification delivery
File ProcessingUpload, transform, process
Event-Driven ArchitectureSystem-wide event distribution

Common Message Queue Services

ServiceProviderTypeBest For
Azure Queue StorageMicrosoftPoint-to-PointSimple, cost-effective
Azure Service BusMicrosoftPub/SubEnterprise features
RabbitMQOpen SourceHybridFlexible deployment
KafkaOpen SourceLog-basedHigh throughput
AWS SQSAmazonPoint-to-PointAWS integration
AWS SNSAmazonPub/SubAWS integration

Next Steps

References