TopDev

Redis Pub/Sub là gì? Giải thích chi tiết và ứng dụng trong phát triển phần mềm

minhdev 📖 4 phút đọc

Redis Pub/Sub là một cơ chế giao tiếp giữa các ứng dụng hoặc các thành phần trong hệ thống thông qua mô hình publish-subscribe (xuất bản - đăng ký). Đây là tính năng mạnh mẽ giúp truyền tải thông điệp theo dạng real-time (thời gian thực) mà không cần lưu trữ tin nhắn trong Redis.



Cách hoạt động của Publish và Subscribe trong Redis?#

Trong Redis Pub/Sub, có hai vai trò chính:

  • Publisher (Người xuất bản): Gửi tin nhắn đến một hoặc nhiều channel (kênh) cụ thể.

  • Subscriber (Người đăng ký): Đăng ký nhận tin nhắn từ các channel mà họ quan tâm.

Khi một publisher gửi tin nhắn lên một channel, tất cả các subscriber đã đăng ký kênh đó sẽ nhận được tin nhắn ngay lập tức. Quá trình này được diễn ra rất nhanh và không yêu cầu publisher biết có bao nhiêu subscriber đang theo dõi.



Khi nào nên dùng Pub/Sub trong Redis?#

Redis Pub/Sub phù hợp với các tình huống:

  • Truyền tin nhắn thời gian thực như chat, thông báo, cập nhật trạng thái.

  • Các hệ thống cần truyền dữ liệu nhanh giữa các dịch vụ hoặc các thành phần trong ứng dụng.

  • Đa người dùng cần nhận thông tin cùng lúc theo kênh cụ thể.

Tuy nhiên, nếu bạn cần lưu trữ và đảm bảo tin nhắn không bị mất, Pub/Sub không phải là lựa chọn phù hợp.



Redis Pub/Sub có lưu trữ tin nhắn không?#

Redis Pub/Sub không lưu trữ tin nhắn. Khi tin nhắn được publish lên channel, chỉ những subscriber đang active và đã đăng ký mới nhận được tin nhắn. Nếu subscriber offline hoặc chưa đăng ký lúc tin nhắn được gửi, họ sẽ không nhận được.

Vì vậy, Pub/Sub phù hợp với các ứng dụng real-time mà độ tin cậy về lưu trữ không phải yếu tố quan trọng.



Redis Stream khác gì Pub/Sub?#

Redis Stream là một tính năng mới hơn, cho phép lưu trữ tin nhắn dưới dạng hàng đợi (log) và hỗ trợ tính năng đọc lại tin nhắn, đảm bảo độ bền và thứ tự.

  • Pub/Sub: Truyền tin tức thời, không lưu trữ, không đảm bảo độ tin cậy khi subscriber mất kết nối.

  • Stream: Lưu trữ dữ liệu, có thể đọc lại, hỗ trợ nhiều kiểu xử lý tin nhắn phức tạp, thích hợp cho hệ thống cần độ bền và sắp xếp.



Có thể gửi dữ liệu JSON trong Pub/Sub không?#

Redis Pub/Sub chỉ gửi dữ liệu dạng string hoặc binary nên bạn hoàn toàn có thể gửi dữ liệu JSON bằng cách serialize (chuẩn hóa) JSON thành chuỗi trước khi publish. Khi subscriber nhận, họ có thể parse chuỗi JSON này thành đối tượng để xử lý.



Làm sao hủy subscribe trong Redis?#

Để hủy subscribe (bỏ đăng ký) một hoặc nhiều channel trong Redis, bạn có thể sử dụng lệnh:

UNSUBSCRIBE [channel1 channel2 ...]

Lệnh này sẽ ngắt kết nối subscriber khỏi các kênh đó và subscriber sẽ không nhận được tin nhắn từ các channel đã bỏ đăng ký nữa.



Redis Pub/Sub có đảm bảo độ tin cậy không?#

Redis Pub/Sub không đảm bảo độ tin cậy trong việc truyền tải tin nhắn:

  • Tin nhắn sẽ bị mất nếu subscriber offline hoặc chưa subscribe kênh khi tin nhắn được gửi.

  • Không có cơ chế retry hay lưu trữ lại tin nhắn.

Vì vậy, Redis Pub/Sub không phù hợp cho các ứng dụng đòi hỏi tính nhất quán hoặc bền vững của dữ liệu tin nhắn.



Có thể dùng Redis Pub/Sub để làm hàng đợi không?#

Mặc dù Redis Pub/Sub có thể truyền tin nhanh nhưng không nên dùng làm hàng đợi (queue) vì thiếu tính lưu trữ và đảm bảo tin nhắn.

Nếu bạn cần làm hàng đợi với Redis, hãy dùng Redis List hoặc Redis Stream, vì chúng hỗ trợ lưu trữ, xử lý tuần tự và đảm bảo dữ liệu hơn.



Làm sao scale Pub/Sub với nhiều subscriber?#

Để scale Redis Pub/Sub khi có nhiều subscriber:

  • Bạn có thể phân tán các subscriber trên nhiều server khác nhau.

  • Sử dụng Redis Cluster để tăng khả năng mở rộng.

  • Tạo các channel theo từng nhóm nhỏ, tránh quá tải một channel duy nhất.

  • Kết hợp thêm middleware hoặc message broker ngoài Redis nếu hệ thống lớn cần quản lý subscriber phức tạp hơn.



Kết luận

Redis Pub/Sub là công cụ mạnh mẽ cho các ứng dụng cần truyền tin nhắn real-time nhanh, đơn giản và nhẹ nhàng. Tuy nhiên, do không lưu trữ tin nhắn và không đảm bảo độ tin cậy, bạn nên cân nhắc kỹ khi lựa chọn sử dụng Pub/Sub cho các hệ thống đòi hỏi độ bền dữ liệu.

Nếu cần tính năng lưu trữ hoặc quản lý tin nhắn phức tạp, Redis Stream hoặc các message queue khác sẽ phù hợp hơn. Đồng thời, việc gửi dữ liệu JSON trong Pub/Sub rất đơn giản và linh hoạt, giúp bạn dễ dàng tích hợp trong nhiều tình huống phát triển.

Bài liên quan trong #Database

✓ Đã sao chép link