Bỏ qua, đến nội dung

Hướng dẫn cài đặt — Queue Adapter RabbitMQ

Yêu cầu

  • Server Digiforce đang chạy
  • RabbitMQ server đang hoạt động và có thể kết nối từ Digiforce

Bước 1: Kích hoạt Plugin

Vào Settings → Plugin Manager, tìm plugin-queue-adapter-rabbitmq và bật.

Bước 2: Cấu hình biến môi trường

Đặt hai biến bắt buộc:

bash
QUEUE_ADAPTER=rabbitmq
QUEUE_ADAPTER_RABBITMQ_URL=amqp://guest:guest@localhost:5672

Quan trọng: QUEUE_ADAPTER=rabbitmq là điều kiện tiên quyết. Nếu không đặt biến này, plugin sẽ không kích hoạt adapter dù đã bật trong Plugin Manager.

Tất cả biến môi trường

BiếnMặc địnhMô tả
QUEUE_ADAPTER(bắt buộc)Đặt rabbitmq
QUEUE_ADAPTER_RABBITMQ_URL(bắt buộc)URL kết nối AMQP
QUEUE_CONNECTION_RETRY_MAX_ATTEMPTS20Số lần retry khi kết nối thất bại
QUEUE_CONNECTION_RETRY_DELAY200Delay giữa các lần retry (ms, tăng tuyến tính)

Bước 3: Khởi động lại server

Khởi động lại server và kiểm tra log. Plugin ghi log khi:

  • Kết nối thành công (không có log lỗi)
  • Kết nối thất bại: rabbitmq connect failed, retries: N
  • Kết nối lại: rabbitmq reconnecting...rabbitmq reconnect success

Luồng xử lý message chi tiết

Các tham số message

Tham sốMặc địnhMô tả
timeoutQUEUE_DEFAULT_ACK_TIMEOUTTimeout cho mỗi job (AbortSignal)
maxRetries0Số lần retry tối đa (0 = không retry)
retried0Số lần đã retry (tự tăng khi re-publish)
timestampDate.now()Thời điểm publish message

Concurrency và Prefetch

Plugin sử dụng channel.prefetch(concurrency) để giới hạn số message RabbitMQ gửi cho consumer cùng lúc. Giá trị mặc định là QUEUE_DEFAULT_CONCURRENCY từ server framework.

Idle check

Trước khi xử lý message, plugin kiểm tra event.idle(). Nếu consumer đang bận:

  1. NACK message (trả về queue)
  2. Cancel consume
  3. Chờ interval ms rồi kiểm tra lại
  4. Resume consume khi idle

Graceful Shutdown

Khi server tắt, plugin thực hiện graceful shutdown:

Channel tự động phục hồi

Nếu một channel bị đóng (lỗi mạng, RabbitMQ restart channel), plugin tự động:

  1. Tạo channel mới cho queue đó
  2. Thiết lập lại consumer

Nếu connection bị đóng, plugin:

  1. Đóng tất cả channels
  2. Kết nối lại
  3. Khôi phục tất cả consumers

Lưu ý triển khai

  • RabbitMQ cần accessible từ tất cả instance của Digiforce
  • Message ID được sinh từ SHA-256 hash của nội dung
  • Mỗi queue sử dụng channel riêng — tránh head-of-line blocking
  • Nên bật RabbitMQ Management plugin (rabbitmq_management) để monitor qua web UI (port 15672)
  • Khuyến nghị cấu hình durable queues và message persistence cho production