2011-06-14 2 views
3

우리는 내구성이 뛰어난 RabbitMQ 대기열을 보유하고 있습니다. 소비자가 대기열에서 항목을 가져 오면 처리 한 다음 확인합니다. 소비자가 항목을 처리하지 못하면 누군가 문제를 해결하고 멈추는 것을 기다리는 오류를 인쇄합니다. 확인 응답이 전송되지 않습니다. 소비자가받은 항목을 다시 시작하면 대기열에있는 다음 항목이며 확인하지 않은 항목은 아닙니다. Basic.Recover()는 도움이되지 않습니다 (.NET 클라이언트 사용). 대기열로 작동시키는 방법은 아이디어가 없다면 항상 첫 번째 항목을 얻으십시오.RabbitMQ 기본 복구가 작동하지 않습니다.

답변

3

this entry in the RabbitMQ FAQ을 참조하십시오. RabbitMQ가 포장되지 않은 메시지를 대기열의 머리 (소비자가 뽑기 전의 위치)에 다시 대기열에 넣기를 원할 수도 있지만 실제로는 경험 한 바와 같이 현실이 달라질 수 있습니다.

는 그래서 Basic.Recover()은 당신이 예상대로 작동하지 않습니다 단지 (미래의 재 처리 큐에 다시 배치이었다 메시지)를 작동하지 않습니다 아니다. 내 마음의 뒤쪽에

뭔가 당신 1의 프리 페치 수를 설정하고 하나 개의 소비자가 언제든지 큐에 연결에서 가장함으로써 원하는 동작을 얻을 수 있지만 수 있음을 알려줍니다 그렇다고 보장 할 수는 없습니다. 노력할 가치가 있습니다. 그러나 작동하더라도 영원히 케이스에 머물러서는 안되며 너무 적은 프리 페치 횟수로 고객의 메시지/초 성능이 저하 될 수 있습니다.

+0

내 계획은 프리 페치 횟수를 1로 설정하고, 실패한 메시지를 파일로 직렬화하여 어쨌든 확인합니다. 프로세스가 다시 시작되면 해당 파일에서 첫 번째 메시지를 가져 와서 처리 한 다음 큐 사용을 다시 시작합니다. – Kimi

+1

프로세스가 종료 된 경우에도 작동하지 않습니다. 토끼는 그것을 어쨌든 대기열의 끝에 놓습니다. – Kimi

2

메시지는 두 가지 방법으로 소비 할 수있는 NOACK = 허위 또는 NOACK = 사실

NOACK이 NOACK가 true 메시지로 설정되어

가 자동으로 제거됩니다 Model.BasicConsume 및 Model.BasicGet

모두의 매개 변수 전달 된 후에 큐. noAsk가 false로 설정된 경우 basicAck를 호출 할 때만 메시지가 제거됩니다.

noAck = false이고 basicAck를 호출하지 않으면 메시지는 유지되지만 응용 프로그램을 다시 시작하거나 먼저 사용 한 연결을 닫을 때까지 다른 사용자에게 수신되지 않습니다. BasicReject를 호출하면 메시지가 가입자에게 다시 전달됩니다.

이 정보가 도움이되기를 바랍니다.

+0

위의 "noAsk"예제를 "noAck"로 변경해야합니다. –

0

우선 순위가 높은 대기열과 일반적인 우선 순위가있는 대기열 쌍이 있으므로이 동작을 얻을 수 있습니다. 프리 페치 횟수를 1로 설정 한 다음 basic.get을 사용하여 대기열을 번갈아 바꿉니다. 대부분의 경우 우선 순위 대기열은 비어 있지만 다시 대기열을 만들려는 경우 메시지를 우선 순위가 높은 대기열에 다시 게시하십시오.

이것은 여러 프로세스에서 메시지 스트림을 사용하고 하나의 프로세스에서 메시지를 구제하기로 결정한 시나리오에서 작동합니다. 그 메시지는 다른 프로세스에 의해 거의 즉각적으로 포착 될 것입니다.

+0

내 시나리오는 매우 간단합니다. 하나의 소비자가 있고 메시지 순서가 중요하며 예기치 않은 시스템 종료 (정전)가 발생하면 RabbitMQ는 대기열의 첫 번째 메시지를 대기열 끝에 넣습니다. 그래서 나는 다른 브로커를 사용하여 클라이언트가 큐를 대기열에서 제외 할 때까지 먼저 메시지를 보관해야한다고 생각합니다. – Kimi

+0

더 관련성이 높은 질문을 여기에서 요청했습니다. http://stackoverflow.com/questions/6369190/what-open-source-message-queuing-software-provides-dubability-with-strict-orderin – Kimi

1

RabbitMQ는이 문제의 부분을 수정 한 것으로 보입니다. since 2.7.0 이제 메시지는 게시 순서대로 다시 큐됩니다. 대기열에 둘 이상의 가입자가있는 경우에도 원래 순서대로 메시지가 도착할 수 있습니다.

관련 문제