Postgres는 메시지 대기열로 수신 / 알림


17

Postgres Listen / Notify 기능을 사용하여 메시지를 채널로 전달하고 하나의 리스너 만이 메시지를 사용하도록하는 방법이 있습니까?

이것의 목적은 동일한 Postgres 채널을 듣는 여러 개의 '작업자'앱이 있다는 것입니다. 그러나 알림 채널을 통해받은 메시지 당 한 번만 작업을 수행하고 싶습니다.

Postgres에서 Listen / Notify가 올바른 기능이 아닌 경우 사용해야하는 별도의 기능이 있습니까?

이상적으로는 추가 확장을 사용하지 않고이 작업을 수행하고 싶습니다.

답변:


23

PostgreSQL 설명서에NOTIFY 따르면 :

NOTIFY 명령은 현재 데이터베이스에서 지정된 채널 이름에 대해 LISTEN 채널을 이전에 실행 한 클라이언트 애플리케이션에 선택적 "페이로드"문자열과 함께 알림 이벤트를 보냅니다 . 알림은 모든 사용자에게 표시됩니다 .

(강조 광산)

이것은 당신이 원하는 것을 할 수 없음을 의미 단지와 함께 LISTEN/NOTIFY . 그러나 대기중인 메시지를 저장하고 LISTEN/NOTIFY외부 메시지에 "메시지 큐에 새로운 기능이 있음"을 알리고 이러한 외부 응용 프로그램의 일부 추가 논리를 사용하여 하나만 메시지를 사용하도록 테이블을 둘 수 있습니다 .

PostgreSQL 9.5에서 SKIP 잠금이란 기사에 설명 된 전략 은 무엇입니까? 아마도 PostgreSQL 내 에서 메시지 큐 를 구현하는 가장 안전하고 쉬운 방법 일 것입니다 . "SKIP LOCKED의 도움"부분에 특히주의하십시오. 주의 사항 중 하나를주의 깊게 읽으십시오.

RDBMS에 구현 된 대기열은 PostgreSQL과 동일한 원자 성과 내구성을 보장하는 고속 전용 대기열 시스템의 성능과 절대 일치하지 않습니다. SKIP LOCKED를 사용하면 기존의 데이터베이스 내 접근 방식보다 낫지 만 최적화 된 전용 외부 큐 엔진을 사용하면 더 빠르게 진행됩니다.

큐 볼륨이 높은 경우에 특히 중요합니다.


1
그 기사의 저자에게 현상금을 수여하기를 바랍니다. 매우 도움이되었습니다.
와일드 카드

3

나는 좋은 성공으로 잠시 동안 이와 같은 것을했고, RabbitMQ 와이 플러그인을 사용했습니다 https://github.com/gmr/pgsql-listen-exchange

기본적으로 RabbitMQ PostgreSQL에 연결하고 알림 이벤트를 수신 한 다음 RabbitMQ를 사용하여 해당 메시지를 필요한만큼 많은 대기열에 집계하고 각 대기열을 소비하는 앱을 가질 수 있습니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.