Theo tài liệu của PostgreSQL vềNOTIFY
:
Lệnh NOTIFY gửi một sự kiện thông báo cùng với chuỗi "tải trọng" tùy chọn đến từng ứng dụng khách đã thực hiện kênh LISTEN trước đó cho tên kênh được chỉ định trong cơ sở dữ liệu hiện tại. Thông báo được hiển thị cho tất cả người dùng .
(nhấn mạnh của tôi)
Điều này có nghĩa là bạn không thể làm những gì bạn muốn chỉ với LISTEN/NOTIFY
. Tuy nhiên, bạn có thể có cả một bảng để lưu trữ các tin nhắn được xếp hàng, LISTEN/NOTIFY
để thông báo cho các ứng dụng bên ngoài rằng "có những điều mới trong hàng đợi tin nhắn" và sử dụng một số logic bổ sung từ các ứng dụng bên ngoài này để chỉ một người sử dụng tin nhắn.
Chiến lược được mô tả trong bài viết SKIP LOCKED để làm gì trong PostgreQuery 9.5? có lẽ là cách an toàn / dễ dàng nhất để thực hiện hàng đợi tin nhắn trong PostgreSQL. Đặc biệt chú ý đến phần "Cách SKIP LOCKED giúp". Đọc kỹ một trong những cảnh báo của họ:
Một hàng đợi được triển khai trong RDBMS sẽ không bao giờ phù hợp với hiệu năng của một hệ thống xếp hàng chuyên dụng nhanh, thậm chí một hệ thống đảm bảo tính nguyên tử và độ bền tương tự như PostgreQuery. Sử dụng SKIP LOCKED tốt hơn các phương pháp tiếp cận trong cơ sở dữ liệu hiện có, nhưng bạn vẫn sẽ đi nhanh hơn bằng cách sử dụng công cụ xếp hàng bên ngoài chuyên dụng và được tối ưu hóa cao.
Điều này đặc biệt quan trọng nếu khối lượng hàng đợi cao.