PostgreSQL과 같은 데이터베이스에서 RabbitMQ와 같은 메시지 브로커가 필요한 이유는 무엇입니까?


215

Celery 와 같은 스케줄링 시스템을위한 작업 / 메시지 큐를 만드는 데 사용할 수있는 RabbitMQ 와 같은 메시지 브로커 를 처음 사용합니다 .

자, 여기 질문이 있습니다 :

  • PostgreSQL 에서 새로운 작업을 추가하고 Celery와 같은 소비자 프로그램 에서 사용할 수있는 테이블을 만들 수 있습니다.

  • 왜 지구상에서 RabbitMQ와 같은 완전히 새로운 기술을 설치하고 싶습니까?

PostgreSQL과 같은 데이터베이스가 분산 환경에서 작동 할 수 있기 때문에 스케일링이 답이 될 수 없다고 생각합니다.

데이터베이스가 특정 문제에 어떤 문제를 일으키는 지 봤습니다.

  • 폴링은 데이터베이스 사용량이 적고 성능이 낮게 유지
  • 테이블 잠금-> 다시 낮은 성능
  • 수백만 행의 작업-> 다시 말하면 폴링 성능이 낮습니다.

이제 RabbitMQ 또는 이와 같은 다른 메시지 브로커는 이러한 문제를 어떻게 해결합니까?

또한 AMQP프로토콜이 다음과 같은 것으로 나타났습니다 . 그게 뭐에요?

Redis 를 메시지 브로커로도 사용할 수 있습니까 ? RabbitMQ보다 Memcached와 더 유사합니다.

이것에 약간의 빛을 비추십시오!


9
PostgreSQL의 경우 잠금 기능은 리더가 작성자에 의해 차단되지 않는 MVCC를 구현하기 때문에 MCRC를 구현하므로 그 영향이 훨씬 적습니다. 메시지 큐로 데이터베이스 사용을 비판하는 것으로 밝혀진 대부분의 기사는 MySQL을 염두에두고 있습니다.
CadentOrange

메시지 브로커는 노드간에 데이터를 이동시키는 반면 데이터베이스는 데이터를 한 곳에 보관합니다. 여러 노드에서 데이터베이스의 데이터에 액세스 할 수 있다고해서 노드간에 데이터를 빠르게 전송할 수있는 좋은 도구는 아닙니다.
theMayer

2
"스케줄링 시스템과 같은 celery"— 방금 질문 에서 내 디자인에 유용한 것을 배웠습니다 . 답변을 읽으려면 ...
Mark K Cowan

메시지 브로커 생성자와 소비자를 사용하면 분리됩니다.
giorgi dvalishvili

벨로우즈 링크를 볼 수 있습니다. 광범위한 설명이 있습니다 : stackoverflow.com/a/51377756/3073945
Md. Sajedul Karim

답변:


110

토끼의 대기열은 메모리에 상주하므로 데이터베이스에서이를 구현하는 것보다 훨씬 빠릅니다. (양호한) 전용 메시지 큐는 스로틀 링 / 흐름 제어와 같은 필수 큐잉 관련 기능과 서로 다른 라우팅 알고리즘을 선택할 수있는 기능을 제공하여 커플의 이름을 지정해야합니다 (토끼가 제공하는 것 이상). 프로젝트의 크기에 따라 메시지 전달 구성 요소를 데이터베이스와 분리하여 하나의 구성 요소에 많은 부하가 발생하는 경우 다른 구성 요소의 작업을 방해하지 않아도됩니다.

언급 한 문제에 관해서는 :

  • 데이터베이스를 흐릿하고 낮은 성능으로 유지하는 폴링 : Rabbitmq를 사용하여 생산자는 폴링보다 훨씬 성능이 뛰어난 소비자에게 업데이트를 푸시 할 수 있습니다 . 데이터는 필요할 때 소비자에게 간단히 전송되므로 낭비되는 점검이 필요 없습니다.

  • 테이블 잠금-> 다시 낮은 성능 : 잠글 테이블이 없습니다. : P

  • 수백만 행의 작업-> 다시 폴링 성능이 낮습니다. 위에서 언급 한 것처럼 Rabbitmq는 RAM에 상주하므로 더 빠르게 작동하며 흐름 제어를 제공합니다. 필요한 경우 RAM이 부족한 경우 디스크를 사용하여 메시지를 임시로 저장할 수도 있습니다. 2.0 이후 Rabbit은 RAM 사용량이 크게 향상되었습니다. 클러스터링 옵션도 사용할 수 있습니다.

AMQP와 관련하여 정말 멋진 기능은 "교환"이며 다른 교환으로 라우팅하는 기능입니다. 따라서 유연성이 향상되고 확장시 매우 유용 할 수있는 다양한 정교한 라우팅 유형을 만들 수 있습니다. 좋은 예를 보려면 다음을 참조하십시오.


(출처 : springsource.com )

및 : http://blog.springsource.org/2011/04/01/routing-topologies-for-performance-and-scalability-with-rabbitmq/

마지막으로, redis와 관련하여 예, 메시지 브로커로 사용될 수 있으며 잘 할 수 있습니다. 그러나 rabbitmq는 완전한 기능을 갖춘 엔터프라이즈 급 전용 메시지 대기열이되기 위해 처음부터 구축 되었기 때문에 redis보다 많은 메시지 큐잉 기능을 제공합니다. 반면에 Redis는 주로 메모리 내 키-밸류 저장소로 만들어졌습니다 (현재보다 훨씬 많은 일을하지만 스위스 군용 칼이라고도 함). 그래도 소규모 프로젝트에 대해 Redis로 좋은 결과를 얻는 많은 사람들을 읽거나 들었지만 큰 응용 프로그램에서는 그에 대해 많이 들어 보지 못했습니다.

다음은 장기 폴링 채팅 구현에 사용되는 redis의 예입니다. http://eflorenzano.com/blog/2011/02/16/technology-behind-convore/


2
데이터베이스 위에 JMS 구현 (즉, 메시지 전달 시스템)을 구현했습니다. 나는 당신을 말할 수 있다 가능하지만, 재미 아니다 그것은 일반적으로 그것을 할 돈을 지불하지 않습니다. 언급 한 문제 중 일부는 해결할 수 있지만 복잡성을 상당히 증가시킵니다. 전적으로 동의합니다. 필요한 경우 전용 MQ 시스템을 사용하십시오. 그러나 워크로드가 적 으면 DB에 배치하지 않아도됩니다.
Joachim Sauer

1
당신은 단순히 모든 우려 / 의심을 다루었습니다. 멋진 답변!
Yugal Jindle

그 흥미 롭군요. 그런데 일관성은 어떻습니까? 대기열에 수백 개의 작업이 있고이를 램에 보유한 노드가 충돌하면 어떻게됩니까?
Mahn

22
실제로 PostgreSQL에서는 폴링 (NOFIY 참조)이나 테이블 잠금 (MVCC 참조)이 없습니다. PostgreSQL은 여전히 ​​메시지 대기열 용으로 설계되지 않았지만 완전히 적합하지는 않습니다.
jkj

3
@jkj가 말한 것처럼 NOTIFY가 있으며 테이블 잠금이 없습니다. 유일한 문제는 높은 대역폭의 메시지처럼 보입니다. Rabbit과 같은 완전히 새로운 시스템을 유지 관리하는 대신 전용 PostgreSQL 인스턴스를 보유 할 수 없습니까? 1) 병목 현상에 도달 할 때까지 단일 PostgreSQL 인스턴스를 사용한 다음 2) 전용 Postgres를 사용한 다음 3) 브로커로 Rabbit으로 쉽게 전환 할 수 있습니다. Rabbit로 시작하는 것이 사전 최적화 된 것 같습니다.
Joe

72

PostgreSQL 9.5

PostgreSQL 9.5는 다음을 통합 SELECT ... FOR UPDATE ... SKIP LOCKED합니다. 따라서 작업 큐 시스템을 훨씬 간단하고 쉽게 구현할 수 있습니다. 다른 세션이 잠그지 않은 'n'개의 행을 간단하게 가져오고 작업이 완료되었다는 확인을 커밋 할 때까지 잠금을 유지하기 때문에 더 이상 외부 큐 시스템이 필요하지 않을 수 있습니다. 외부 조정이 필요한 경우 2 단계 트랜잭션에서도 작동합니다.

외부 큐잉 시스템은 유용한 기능을 제공하여 미리 준비된 기능, 검증 된 성능, 다른 시스템과의 통합, 수평 스케일링 및 페더레이션 옵션 등을 제공합니다. 그럼에도 불구하고 더 이상 간단한 경우에는 더 이상 필요하지 않습니다.

이전 버전

그러한 도구는 필요 하지 않지만 도구를 사용하면 삶을 더 쉽게 만들 수 있습니다. 데이터베이스에서 큐잉을 수행하는 것은 쉬워 보이지만 실제로는 고성능의 안정적인 동시 큐잉이 실제로 관계형 데이터베이스에서 제대로 수행하기 어렵다는 것을 알게 될 것 입니다.

PGQ 와 같은 도구 가 존재하는 이유 입니다.

당신은 사용하여 PostgreSQL을 폴링 제거 할 수 LISTENNOTIFY있지만, 높은 동시 작업을 보존하고 삽입을 차단하지 않으면 서 그 단 하나의 소비자에게 큐의 맨 오프 항목 밖으로 안정적으로 나눠의 문제를 해결하지 않습니다. 당신이 생각하는 모든 간단하고 명백한 해결책은 실제로는이 문제를 해결하지 못할 것이며, 단일 작업자 대기열 가져 오기의 덜 효율적인 버전으로 퇴보하는 경향이 있습니다.

고도로 동시 다중 작업자 큐 페치가 필요하지 않은 경우 PostgreSQL에서 단일 큐 테이블을 사용하는 것이 전적으로 합리적입니다.


11
reliably handing out entries off the top of the queue to exactly one consumer while preserving highly concurrent operation and not blocking inserts. 은 그것을 요약합니다-맞습니까?
Yugal Jindle
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.