10 - Spring Boot RabbitMQ

03/03/2025 - 4 phút

Follow  on Google News

Trong bài viết này, chúng ta sẽ tìm hiểu về Spring Boot RabbitMQ, cách tích hợp RabbitMQ trong ứng dụng Spring Boot.

1. Giới Thiệu

Trong các hệ thống phân tán và microservices, việc giao tiếp giữa các dịch vụ là một thách thức quan trọng. RabbitMQ là một trong những hệ thống Message Queue (MQ) phổ biến giúp:

  • Giảm tải cho hệ thống bằng cách xử lý nền (async processing).
  • Đảm bảo giao tiếp giữa các dịch vụ không đồng bộ.
  • Tăng độ bền vững của dữ liệu khi có lỗi xảy ra.

Trong bài viết này, chúng ta sẽ tìm hiểu Spring Boot RabbitMQ, cách cấu hình producer và consumer, và xây dựng hệ thống message-driven hiệu quả.


2. Cài Đặt RabbitMQ Trong Spring Boot

2.1. Thêm Dependency RabbitMQ

Spring Boot hỗ trợ RabbitMQ thông qua Spring AMQP. Thêm dependency sau vào pom.xml:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

2.2. Cấu Hình RabbitMQ Trong application.properties

Nếu bạn sử dụng RabbitMQ local (mặc định trên cổng 5672), hãy cấu hình như sau:

spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

Lưu ý: Nếu bạn chưa cài đặt RabbitMQ, bạn có thể tải về tại RabbitMQ hoặc chạy với Docker:

docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:management

Bạn có thể truy cập giao diện quản lý tại: http://localhost:15672 (user: guest, password: guest).


3. Xây Dựng Producer Và Consumer Trong Spring Boot

3.1. Cấu Hình Queue, Exchange Và Binding

Tạo lớp RabbitMQConfig.java để định nghĩa queue, exchange, và binding:

import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RabbitMQConfig {
    public static final String QUEUE_NAME = "test_queue";
    public static final String EXCHANGE_NAME = "test_exchange";
    public static final String ROUTING_KEY = "test_routing";

    @Bean
    public Queue queue() {
        return new Queue(QUEUE_NAME, true);
    }

    @Bean
    public DirectExchange exchange() {
        return new DirectExchange(EXCHANGE_NAME);
    }

    @Bean
    public Binding binding(Queue queue, DirectExchange exchange) {
        return BindingBuilder.bind(queue).to(exchange).with(ROUTING_KEY);
    }
}
  • Queue: Nơi lưu trữ tin nhắn tạm thời trước khi consumer xử lý.
  • Exchange: Điều hướng tin nhắn đến queue phù hợp.
  • Binding: Liên kết queue với exchange thông qua routing key.

3.2. Tạo Producer Gửi Tin Nhắn

Producer là thành phần chịu trách nhiệm gửi tin nhắn vào RabbitMQ. Tạo RabbitMQProducer.java:

import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Service;

@Service
public class RabbitMQProducer {
    private final RabbitTemplate rabbitTemplate;

    public RabbitMQProducer(RabbitTemplate rabbitTemplate) {
        this.rabbitTemplate = rabbitTemplate;
    }

    public void sendMessage(String message) {
        rabbitTemplate.convertAndSend(RabbitMQConfig.EXCHANGE_NAME, RabbitMQConfig.ROUTING_KEY, message);
        System.out.println("Đã gửi tin nhắn: " + message);
    }
}
  • RabbitTemplate là công cụ giúp gửi tin nhắn đến RabbitMQ.
  • convertAndSend() gửi tin nhắn tới exchange.

3.3. Tạo Consumer Nhận Tin Nhắn

Consumer sẽ lắng nghe và xử lý tin nhắn từ queue. Tạo RabbitMQConsumer.java:

import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Service;

@Service
public class RabbitMQConsumer {
    @RabbitListener(queues = RabbitMQConfig.QUEUE_NAME)
    public void receiveMessage(String message) {
        System.out.println("Nhận tin nhắn: " + message);
    }
}
  • @RabbitListener giúp tự động lắng nghe queue và xử lý tin nhắn nhận được.

4. Kiểm Tra Ứng Dụng RabbitMQ

4.1. Tạo Controller Để Gửi Tin Nhắn

import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/rabbitmq")
public class RabbitMQController {
    private final RabbitMQProducer producer;

    public RabbitMQController(RabbitMQProducer producer) {
        this.producer = producer;
    }

    @GetMapping("/send/{message}")
    public String sendMessage(@PathVariable String message) {
        producer.sendMessage(message);
        return "Tin nhắn đã được gửi: " + message;
    }
}

4.2. Chạy Ứng Dụng Và Gửi Tin Nhắn

  1. Chạy ứng dụng Spring Boot: mvn spring-boot:run

  2. Gửi tin nhắn bằng API:

    http://localhost:8080/rabbitmq/send/HelloRabbitMQ

  3. Kiểm tra console:

    Đã gửi tin nhắn: HelloRabbitMQ Nhận tin nhắn: HelloRabbitMQ

🎉 Hệ thống đã hoạt động!


5. Tối Ưu RabbitMQ Với Spring Boot

5.1. Cấu Hình Prefetch Và QoS

Bạn có thể giới hạn số lượng tin nhắn xử lý đồng thời bằng prefetch:

spring.rabbitmq.listener.simple.prefetch=5

Điều này giúp hệ thống tránh quá tải khi có quá nhiều tin nhắn.

5.2. Kích Hoạt Cơ Chế Retry Khi Lỗi

spring.rabbitmq.listener.simple.retry.enabled=true
spring.rabbitmq.listener.simple.retry.max-attempts=3

Nếu consumer gặp lỗi, tin nhắn sẽ tự động thử lại tối đa 3 lần trước khi bị loại bỏ.

5.3. Cấu Hình Dead Letter Queue (DLQ)

Dead Letter Queue giúp xử lý tin nhắn lỗi thay vì mất dữ liệu:

@Bean
public Queue deadLetterQueue() {
    return new Queue("dead_letter_queue", true);
}
  • Khi consumer gặp lỗi quá nhiều, tin nhắn sẽ được chuyển vào DLQ thay vì bị mất.

6. Kết Luận

Spring Boot RabbitMQ giúp xây dựng hệ thống message queue phân tán mạnh mẽ với nhiều lợi ích:

  • Giao tiếp không đồng bộ giữa các dịch vụ.
  • Tăng hiệu suất bằng cách xử lý nền.
  • Bảo vệ dữ liệu với cơ chế retry và Dead Letter Queue.

👉 Trong bài viết tiếp theo, chúng ta sẽ tìm hiểu về Spring Boot Kafka, một giải pháp message queue mạnh mẽ cho hệ thống phân tán lớn!