Postgres Слухати / Повідомляти як черга з повідомленнями


17

Чи є можливість скористатися функцією прослуховування / сповіщення Postgres для доставки повідомлення на канал і лише один слухач споживає це повідомлення?

Метою цього є те, що у мене є кілька додатків «робочих», які слухають один і той же канал Postgres. Але я хочу лише виконати роботу один раз за повідомлення, отримане через канал сповіщення.

Якщо Слухати / Повідомляти не є правильною особливістю у Postgres, чи є окрема функція, яку я повинен використовувати?

В ідеалі я хотів би зробити це без використання додаткових розширень.

Відповіді:


24

Відповідно до документації PostgreSQL проNOTIFY :

Команда NOTIFY надсилає подія сповіщення разом з необов'язковою рядкою "корисного навантаження" для кожної клієнтської програми, яка раніше виконала канал LISTEN для вказаного імені каналу в поточній базі даних. Повідомлення бачать усі користувачі .

(наголос мій)

Це означає, що ви не можете робити те, що тільки хочете LISTEN/NOTIFY. Однак ви можете мати як таблицю для зберігання повідомлень у черзі, LISTEN/NOTIFYсповіщення зовнішніх програм про те, що "в черзі повідомлень є нові речі", а також використовувати додаткову логіку з цих зовнішніх програм, щоб повідомлення споживало лише один.

Стратегія, зображена в статті Для чого SKIP LOCKED у PostgreSQL 9.5? є, мабуть, найбезпечнішим / найпростішим способом реалізації черги повідомлень у PostgreSQL. Зверніть особливу увагу на частину "Як SKIP LOCKED допомагає". Прочитайте також уважно один із їх застережень:

Черга, реалізована в RDBMS, ніколи не буде відповідати продуктивності швидкої спеціальної системи черги, навіть тієї, яка дає ті ж гарантії атомності та довговічності, що і PostgreSQL. Використання SKIP LOCKED краще, ніж існуючі підходи до бази даних, але ви все одно будете йти швидше, використовуючи спеціалізований та високооптимізований механізм зовнішньої черги.

Це особливо важливо, якщо обсяг черги великий.


1
Мені б хотілося, щоб я міг нагородити автора цієї статті. Так надзвичайно корисно.
Wildcard

3

Я щось подібне робив ще з хорошим успіхом, використовував RabbitMQ і цей плагін https://github.com/gmr/pgsql-listen-exchange

В основному RabbitMQ Підключається до PostgreSQL і слухає подію сповіщень, тоді ви можете використовувати RabbitMQ, щоб зібрати це повідомлення в стільки черг, скільки потрібно, і мати додаток, що використовує кожну чергу

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.