2011-09-13 4 views
1

RabbitMQ의 특정 유스 케이스를 염두에두고 있습니다. 특정 사항을 명확히하고 권장 사항을 요청하고 싶습니다.RabbitMQ (및 node.js)의 비동기 확인

1- 나는 두 가지 작업이 실행되어야하는 메시지를 게시 :

이 시나리오 고려 messageA 및 다음 messageB

2 내 소비자, messageA를 얻을이 메시지에 포함 된 작업을 실행하지만, 작업이 실행되는 동안 서버가 충돌합니다.

내 질문은 : 서버가 다시 시작되면 메시지 A가 다시 대기 상태가되고 메시지 B (충돌 전과 같은 순서) 전에 다시 대기 할 것입니까?

내 소비자가 메시지 수신시 기본적으로 확인했기 때문에 서버가 손상되면 messageA가 손실 될 수 있습니다.

제 아이디어는 메시지를 별도로 소비하고 확인하는 것입니다. 먼저 작업을 실행 한 다음 작업이 성공적으로 실행되면 메시지를 확인합니다.

이 접근 방식에 문제가 있습니까? 다른 일을하도록 조언 해 주시겠습니까?

답변

0

no-ack 모드에서 사용되는 메시지 (http://www.rabbitmq.com/amqp-0-9-1-reference.html#domain.no-ack 참조)는 서버가 전달 된 후 해당 메시지를 완전히 잊어 버렸기 때문에 서버가 손상된 후에 다시 큐에 저장되지 않습니다. 배달 후에는 그러한 메시지에 대해 소비자가 책임을집니다.

작업을 성공적으로 완료 한 후에 만 ​​메시지를 확인하는 것이 시나리오에서 올바른 방법입니다. 메시지가 브로커 충돌을 견뎌 낼 수 있도록하려면 큐가 내구성이 있고 메시지가 지속적으로 게시되고 (배달 모드 2) 게시자 확인 또는 트랜잭션을 사용하여 메시지가 디스크에 기록되는지 확인해야합니다 .

messageA가 처리되는 동안 브로커가 충돌하면 메시지 순서가 보존됩니다. 브로커 대신 소비자가 충돌 한 경우 메시지 순서가 바뀝니다.

1

RabbitMQ는 다시 대기에 대한 메시지의 순서를 유지하지 않습니다 : 대부분의 경우

, 예. 게시자가 메시지 M1, M2, M3 및 M4 (순서대로)를 동일한 채널에 게시하고 동일한 라우팅 인 정보를 게시한다고 가정 해 보겠습니다. 이러한 메시지가 대기열로 라우팅되면 은 게시 된 순서와 동일하게 나타납니다. 대기열에서 소모하면 M1, M2, M3 및 M4가 생성됩니다.

그러나 순서는 대기열이없는 경우에만 보장됩니다. 메시지가 수신되기 전에 소비자가 채널을 닫으면 메시지가 암시 적으로 다시 대기합니다. 예를 들어 소비자가 M1을 수신하면 은 채널을 확인하지 못하고 채널을 닫지 만 다음 소비자는 메시지를 M2, M3, M4, M1 순으로 수신합니다. 소비자가 basic.recover {requeue = true}를 호출하면 메시지를 명시 적으로 다시 대기시킬 수도 있습니다. 적어도 한 번 배달에 대한 FAQ는 이것에 대해 좀 더 자세히 얘기합니다. 세부 사항.이 작업을 수행 할 수 있지만 RabbitMQ 그것을하지 않습니다 RabbitMQ FAQ

자동으로 부모 메시지에 아이들 메시지를 포장하여주기를 직접 관리해야합니다. 그런 다음 메시지 1이 성공했지만 메시지 2가 실패하면 상위 메시지를 관리하고 롤백을 처리하는 코드를 갖게됩니다. 바라건대 그게 도움이 ..

최고를