Postgres Nghe / Thông báo như Hàng đợi Tin nhắn


17

Có cách nào để sử dụng tính năng Postgres Listen / Notify để gửi tin nhắn đến một kênh và chỉ có một người nghe sử dụng tin nhắn này không?

Mục đích của việc này là tôi có nhiều ứng dụng 'worker', tất cả đều nghe cùng một kênh Postgres. Nhưng tôi chỉ muốn công việc được thực hiện một lần cho mỗi tin nhắn nhận được thông qua kênh thông báo.

Nếu Nghe / Thông báo không phải là tính năng chính xác trong Postgres, tôi có nên sử dụng tính năng riêng biệt không?

Lý tưởng nhất là tôi muốn làm điều này mà không cần sử dụng bất kỳ tiện ích mở rộng bổ sung nào.

Câu trả lời:


23

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.


1
Tôi ước tôi có thể trao một tiền thưởng cho tác giả của bài báo đó. Vì vậy, vô cùng hữu ích.
tự đại diện

3

Tôi đã làm một cái gì đó như thế này một thời gian trước với thành công tốt đẹp, tôi đã sử dụng RabbitMQ và plugin này https://github.com/gmr/pgsql-listen-exchange

Về cơ bản RabbitMQ Kết nối với PostgreSQL và lắng nghe sự kiện thông báo, sau đó bạn có thể sử dụng RabbitMQ để tổng hợp tin nhắn đó đến nhiều hàng đợi khi cần và có một ứng dụng tiêu thụ mỗi hàng đợi

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.