De acordo com a documentação do PostgreSQL sobreNOTIFY
:
O comando NOTIFY envia um evento de notificação junto com uma sequência opcional de "carga útil" para cada aplicativo cliente que executou anteriormente o canal LISTEN para o nome do canal especificado no banco de dados atual. As notificações são visíveis para todos os usuários .
(ênfase minha)
Isso significa que você não pode fazer o que deseja apenas com LISTEN/NOTIFY
. No entanto, você pode ter uma tabela para armazenar mensagens na fila, LISTEN/NOTIFY
para notificar aplicativos externos de que "há coisas novas na fila de mensagens" e usar alguma lógica extra desses aplicativos externos para que apenas um consuma a mensagem.
A estratégia descrita no artigo O que é SKIP LOCKED no PostgreSQL 9.5? é provavelmente a maneira mais segura / fácil de implementar uma fila de mensagens no PostgreSQL. Preste atenção especial à parte "Como o SKIP LOCKED ajuda". Leia também cuidadosamente uma de suas advertências:
Uma fila implementada no RDBMS nunca corresponderá ao desempenho de um sistema de fila dedicado rápido, mesmo que garanta a mesma atomicidade e durabilidade que o PostgreSQL. O uso do SKIP LOCKED é melhor do que as abordagens existentes no banco de dados, mas você continuará mais rápido usando um mecanismo de enfileiramento externo dedicado e altamente otimizado.
Isso é especialmente importante se o volume da fila for alto.