Tích Hợp Message Queue ActiveMQ và RabbitMQ Vào Dự Án Spring Boot

Message Queue (MQ) đóng vai trò trung gian trong việc lưu trữ và chuyển tiếp thông điệp giữa các dịch vụ, hoạt động tương tự như hệ thống bưu chính. Mục tiêu chính của kỹ thuật này là hỗ trợ xử lý bất đồng bộ và giảm sự phụ thuộc chặt chẽ giữa các module (decoupling).

Về mặt quy trình sử dụng, MQ có nét tương đồng với cơ sở dữ liệu khi cần thiết lập kết nối trước khi thực hiện ghi hoặc đọc. Tuy nhiên, cơ chế nội bộ phức tạp hơn nhằm đảm bảo tính tin cậy khi chuyển tải dữ liệu. Mô hình cơ bản bao gồm Producer gửi tin vào Queue và Consumer lấy tin từ Queue. Trong các kịch bản phức tạp hơn như định tuyến đến nhiều hàng đợi hoặc nhận từ nhiều nguồn, cần sử dụng cơ chế Exchange và Binding Key thông qua Broker.

Khi làm việc với RabbitMQ trong môi trường Spring, nhà phát triển không cần tự xây dựng client kết nối thủ công. Framework đã cung cấp sẵn các thành phần như RabbitTemplate để gửi dữ liệu và annotation @RabbitListener để xử lý dữ liệu nhận được.

Quy trình gửi tin thường bắt đầu bằng việc kiểm tra sự tồn tại của Queue khi ứng dụng khởi động. Nếu Queue chưa được tạo, hệ thống sẽ tự động thiết lập trước khi đẩy thông điệp vào.

Đối với phía nhận tin, việc định nghĩa các listener là bắt buộc. Trong ActiveMQ, có ba giao diện lắng nghe phổ biến: MessageListener, SessionAwareMessageListenerMessageListenerAdapter. Hai giao diện sau thường được sử dụng khi cần cơ chế xác nhận (acknowledge) hoặc phản hồi hai chiều.

Để tích hợp RabbitMQ vào Spring Boot, cơ chế Auto Configuration sẽ tự động tải các bean cần thiết nếu phát hiện class liên quan trong classpath. Thay vì can thiệp vào lớp cấu hình nội bộ, người dùng chỉ cần khai báo thông số trong file cấu hình ứng dụng.

spring:
  rabbitmq:
    host: 127.0.0.1
    port: 5672
    username: admin
    password: secret
    virtual-host: /dev

Cơ chế @ConfigurationProperties sẽ ánh xạ các giá trị trên vào đối tượng cấu hình tương ứng. Dưới đây là ví dụ về một lớp cấu hình tùy chỉnh để khởi tạo Queue và ConnectionFactory thay vì sử dụng mặc định:

@Configuration
public class MessagingInfrastructure {

    @Bean
    public ConnectionFactory connectionFactory() {
        CachingConnectionFactory factory = new CachingConnectionFactory();
        factory.setHost("127.0.0.1");
        factory.setUsername("admin");
        return factory;
    }

    @Bean
    public Queue orderQueue() {
        return new Queue("order.processing", true);
    }
}

Một lưu ý quan trọng về mô hình tiêu thụ tin nhắn: Khi nhiều consumer cùng đăng ký lắng nghe một Queue, chúng sẽ cạnh tranh để xử lý (competitive consumption). Mỗi tin nhắn chỉ được giao cho một consumer duy nhất. Nếu yêu cầu là tất cả consumer đều phải nhận được cùng một thông điệp, cần thiết lập nhiều Queue khác nhau và binding chúng vào cùng một Exchange.

Thẻ: Java spring-boot rabbitmq activemq messaging-system

Đăng vào ngày 27 tháng 6 lúc 00:55