2017-12-12 1 views
0

3 개의 인스턴스/복제본 (동일한 종류의 응용 프로그램 3 개가 동시에 실행 됨)이있는 응용 프로그램이 있습니다. 그들은 모두 같은 대기열을 소비하므로 RabbitMQ는 메시지를 라운드 로빈 방식으로 전달합니다. 세 개의 인스턴스 모두는 r/w 할 단일 데이터베이스를 공유합니다.RabbitMQ/AMQP 디자인 : 한 소비자가 처리 할 메시지를 어떻게 만들 수 있습니까? 그러나 모든 소비자를 관찰 할 수 있습니까?

대기열이 new-user 메시지를 수신하면이를 한 인스턴스로 전달하고 그 인스턴스가 사용자를 공용 데이터베이스에 저장하는 경우에 효과적입니다.

문제 : 메시지 new-user이 주어지면 하나의 인스턴스가 데이터베이스에 저장되기를 원하지만 (이전처럼)이 세 가지 모두가 캐시를 무효화하기를 원합니다. 따라서 실제로 모든 인스턴스가 동일한 이벤트를 수신해야하지만 그 중 하나만 다르게 작동해야합니다.

이러한 요구 사항을 허용하는 시스템을 어떻게 설계 할 수 있습니까? 내가 생각할 수있는

가장 좋은 방법은 두 거래소 (fanoutdirect), new-user 메시지를 복제하고 fanoutdirect 교류로 보냅니다 별도의 응용 프로그램에 보낼하는 것입니다. 모든 인스턴스는 두 교환기를 모두 수신하며 메시지 처리기에 따라 수행 할 작업을 결정합니다. 메시지가 fanout 인 경우 : 캐시를 무효화합니다 (교환이 direct 인 경우). 어쨌든 하나만받습니다.

답변

2

접근 방법에 문제가있을 수 있습니다. fanout 교환 메시지가 실제로 도착한 before 사용자가 도착하면 인스턴스가 캐시를 너무 일찍 무효화 할 수 있습니다. 난 당신이 다음을 수행해야한다고 생각 :

  • direct 교환 및 당신이 지금 가지고있는 것처럼 모든 사용자 제작자, 라운드 로빈 메시지를 받고 작업자 큐 되세요.
  • 인스턴스를 생성 할 때 모든 사용자 작성자가 듣고있는 메시지 user createdtopic 또는 fanout 교환으로 보냅니다. 그런 다음 모든 인스턴스 (보낸 사람 포함)는 user created 이벤트를 수신하고 해당 캐시를 무효화합니다.
관련 문제