2

RabbitMQ에 처음 접했고, 내가 필요한 것을 얻을 수 있는지 알아보기 위해 노력하고 있습니다.RabbitMQ - 라우팅 키당 하나의 동시 작업자

Worker Queues 패턴을 찾고 있지만 경고가 하나 있습니다. 라우팅 키당 하나의 작업자 만 동시에 실행하고 싶습니다. 내가 명령에 의해 라우팅 키를 사용하여 다음과 같은 메시지를 보내는 경우

가 : a, a, b, c, 나는 동시에 실행에만 3 노동자가 할

설명의 예

. 첫 번째 a 메시지를 받으면 작업자가 메시지를 수신하여 처리합니다.

다음 a 메시지가 수신되고 이전의 a 메시지가 여전히 처리되는 경우 (확인되지 ​​않음) 새로운 a 메시지는 대기열에서 대기해야합니다. bc 메시지가 수신되면 각 메시지를 처리하는 작업자가 생깁니다. 첫 번째 a 메시지가 승인되면 모든 작업자는 다음 a 메시지를 수신 할 수 있습니다.

또 다른 설명 :

그 패턴은

편집 (잠금 및 물건을 ... 처리하기 위해 내 옆에서 모든 응용 프로그램 코드를 작성하지 않고) 자연적인 방법으로 RabbitMQ를 사용 가능할 것이다. 모든 작업자는 모든 메시지를 처리 ​​할 수 ​​있어야하며 처리해야하며 작업자간에 부하를 공유하기 때문에 작업자 당 대기열을 갖고 싶지 않으며 게시자는 어떤 작업자가 메시지를 처리해야하는지 알지 못합니다. 그러나 나는 동시에 2 명의 노동자가 동일한 열쇠를 공유하는 메시지에 대해 작업하고 있지 않은지 확인하고자합니다.

예를 들어 게시자가 userId 필드를 게시하는 게시자 인 경우 두 명의 근로자가 동일한 userId의 메시지를 처리하지 않도록해야합니다. userId 예에 확장

편집 2

. 한 명의 게시자와 3 명의 직원이 있다고 가정 해 보겠습니다. 게시자는 userId 초를 사용하여 { userId: 1, text: 'Hello' }과 같은 메시지를 게시합니다. 3 명의 직원 모두가이 메시지에 동일한 작업을 수행하므로 어떤 사람이 들어오는 메시지를 처리하도록 할 수 있습니다. 그러나 내가 달성하고자하는 것은 한 명의 작업자 만 특정 사용자의 메시지를 처리하도록하는 것입니다 시각. 작업자가 userId 1이라는 메시지를 받고 아직 처리 중이며 userId 1 인 다른 메시지를받은 경우 다른 작업자가 해당 메시지를 선택하지 않았 음을 확인하고 싶습니다. 그러나 다른 메시지가있는 다른 메시지는 다른 사용 가능한 작업자가 처리해야합니다.

userId은 미리 알지 못하고 게시자는 얼마나 많은 직원이 있는지 또는 특정 직원에 대해 구체적인지 알 수 없으므로 처리 할 메시지를 예약하려고합니다.

답변

1

라우팅 키에는 어떤 질문을 할 수 없지만 몇 가지 설정이있는 대기열에는 어떤 것이 내장되어 있습니다.

a 메시지에 대해 "queue_a", b 메시지에 대해 "queue_b"등을 정의하면 원하는만큼 많은 소비자를 연결할 수 있습니다.

RabbitMQ는 지정된 대기열의 단일 소비자에게만 주어진 메시지를 전달합니다.

단일 대기열에서 여러 소비자와 작동하는 방식은 메시지의 기본 라운드 로빈 스타일 발송입니다. 즉, 첫 번째 메시지가 소비자 중 한 명에게 전달되고 다음 메시지 (첫 번째 소비자가 여전히 사용 중이라고 가정)가 다음 소비자에게 전달됩니다.

따라서 대기열의 특정 소비자에게 메시지를 전달해야 할 필요가 있습니다.

메시지가 모든 소비자에게 도달 할 가능성이 동일하고 (항상 같은 소비자에게 전달되지는 않음) 몇 가지 다른 설정이 필요합니다.

먼저 메시지 소비자 no ackfalse ("자동 응답"이라고도 함)으로 설정하십시오. 그러면 코드의 메시지가 ack이됩니다.

는 마지막으로, 설정의 조합으로 1

로 소비자의 "소비자 프리 페치"제한을 설정 한 소비자는 하나의 메시지를 검색하고 작업을 시작합니다. 해당 소비자가 작동하는 동안 대기열에서 대기중인 메시지는 사용 가능한 경우 다른 소비자에게 전달됩니다. 사용할 수있는 메시지가없는 경우 해당 메시지는 사용자가 사용 가능할 때까지 대기열에서 대기합니다.

이렇게하면 주어진 대기열에서 원하는 동작을 수행 할 수 있습니다.

은 ...

하지만, 이것은 단지 큐에 적용 명심하십시오. 라우팅 키는이 방법으로 관리 할 수 ​​없습니다. 교환기에서 일치하는 모든 라우팅 키로 인해 메시지 복사본이 대상 큐로 전송됩니다.

+0

내 견해로는이 awnser가 옳습니다. 그러나 awnser는 대기열에 대해서도 no입니다. 질문은 "모든 작업자가 다음 메시지를받을 수 있습니다."_ 그리고 이것은 불가능합니다. 이 시나리오에서는 모든 대기열에는 하나의 작업자와 하나의 라우팅 키가 있습니다. 그래서 매번 동일한 작업자가 다음 메시지를받습니다. – slowjack2k

+0

고마워, Derick,하지만 @ slowjack2k는 내가 의미하는 바를 옳다. 노동자들에 대한 나의 모든 메시지는 동일하며, 나는 어떤 종업원이 메시지를 집어 들었는지 (그리고 신경 쓰고 싶지 않다) 신경 쓰지 않는다. 난 단지 하나의 작업자가 (메시지 당 생성하는) 일부 키를 기반으로하는 일부 메시지에서 작동하는지 확인하고자합니다. –

+0

@NetanelG이 두 진술은 모여 있지 않습니다. '근로자를위한 모든 메시지는 동일합니다.'그리고'메시지 당 생성되는 키를 기반으로 한 메시지'Aslo Derick의 대답은 당신이 물어 본 질문에 맞습니다. 당신은 그것을 물었지만,이 주석에 따라 편집해야한다고 생각합니다. – cantSleepNow

관련 문제