Bỏ qua, đến nội dung

Câu hỏi thường gặp — PubSub Adapter Redis

Cài đặt

Không kết nối được đến Redis?

Kiểm tra lần lượt:

  1. Redis đang chạy: redis-cli ping → phải trả về PONG
  2. Firewall cho phép kết nối từ server Digiforce đến Redis port (mặc định 6379)
  3. URL đúng format: redis://[password@]host:port/db
  4. Nếu dùng password, đặt đúng trong URL: redis://:mypassword@localhost:6379/0

Bắt buộc phải cài Redis không?

Không. Plugin chỉ cần khi chạy nhiều instance (cluster mode). Với single instance, dùng adapter mặc định (in-memory) là đủ — các sự kiện chỉ cần broadcast trong cùng process.

Redis Streams yêu cầu phiên bản Redis nào?

Redis >= 5.0. Streams là tính năng được giới thiệu từ Redis 5.0. Các phiên bản cũ hơn sẽ báo lỗi khi plugin cố gọi XADD / XREAD.

Sử dụng

Redis restart thì message có bị mất không?

Phụ thuộc cấu hình persistence của Redis:

  • RDB: Message có thể mất kể từ lần snapshot cuối
  • AOF (appendonly): Hầu như không mất (tùy appendfsync setting)
  • Không persistence: Mất toàn bộ message khi restart

Tuy nhiên, Pub/Sub message thường là sự kiện tạm thời (cache invalidation, config reload) — mất message thường không gây hậu quả nghiêm trọng vì instance sẽ tự đồng bộ lại khi cần.

Plugin dùng Redis Pub/Sub hay Redis Streams?

Plugin sử dụng Redis Streams (XADD / XREAD), không phải Redis Pub/Sub truyền thống (PUBLISH / SUBSCRIBE). Ưu điểm:

  • Message được lưu trữ (retention ~1000 entries) — subscriber mới có thể đọc lại message gần đây
  • Không cần 2 connection riêng biệt
  • Hỗ trợ consumer group nếu cần mở rộng

Hiệu năng như thế nào?

Redis Streams rất nhanh:

  • XADD: ~O(1), thêm message vào cuối stream
  • XREAD BLOCK: Blocking I/O, gần như zero CPU khi idle
  • Overhead: < 1ms cho mỗi message trong điều kiện bình thường

Có thể dùng Redis Cluster không?

Có, miễn là tất cả stream keys nằm trên cùng một node. Nếu dùng Redis Cluster, hãy đảm bảo các channel names được hash vào cùng slot (hoặc dùng hash tag: {app}:channel1, {app}:channel2).

Lỗi thường gặp

Lỗi "ECONNREFUSED"

Redis không chạy hoặc không lắng nghe trên port được cấu hình. Kiểm tra:

  • redis-cli -h <host> -p <port> ping
  • Firewall rules

Lỗi "NOAUTH" hoặc "ERR invalid password"

Mật khẩu không đúng. Kiểm tra password trong URL: redis://:correct-password@host:port/db

Lỗi "ERR unknown command 'xadd'"

Redis phiên bản quá cũ (< 5.0). Cần nâng cấp Redis lên >= 5.0 để hỗ trợ Streams.

Message bị mất khi instance restart

Đây là hành vi bình thường. Plugin chỉ đọc message mới hơn thời điểm khởi động (startedAt). Message cũ hơn bị bỏ qua. Nếu cần đảm bảo không mất message, dùng queue adapter (Redis hoặc RabbitMQ) thay vì pub/sub.