2011-02-11 2 views
8

RabbitMQ는 계획중인 프로젝트의 모든 상자를 선택하고 저장합니다. 나는 다른 대기자가 큐를 청취 할 것이고 최신 메시지 (즉, 최신 시퀀스 번호)를 먼저 처리하는 것이 중요합니다 (LIFO).RabbitMQ 재정렬 메시지

내 응용 프로그램은 새로운 메시지가 꽤 오래된 메시지를 쓸모 없게 만드는 것과 같습니다. 여유가있는 근로자가있는 경우 이전 메시지는 계속 처리 할 수 ​​있지만 최신 메시지는 먼저 처리해야합니다.

다양한 포럼과 같은 난 단지 하나 개의 솔루션을 볼 수 있고 클라이언트가 먼저해야 메시지를 처리 ​​할 즉 트롤 어업을 한 후 :

  • 모든 메시지를 그들이에 따라
  • 다시 순서를 소비를 서열 번호

추한 probl 제 메시지를 소비 큐에 다시 제출 클라이언트가 중도에서 죽으면 에메틱. 그러나 여기 누군가 mabye가 더 나은 해결책을 가지고 있습니다. 내 연구의 기반이

(부분)에

:

참고 : 메시지의 예상 트래픽이 약에있을 것입니다 일부 대기열의 경우 1 msg/hour, 100/fo의 경우 다른 사람들. 그래서 별 것도. 나는 오히려 잘 숙제를 한 것 같아요 아무 응답이 없기 때문에

답변

3

)

어쨌든, 내가 지금은 LIFO의 요구 사항을 삭제할 수 있습니다 결정되었다 다른 이해 관계자들과 요구 사항을 논의 후. 우리는 그것에 관해서 걱정할 수 있습니다.

결국 우리가 채택하게 될 해결책은 작업자가 작업자가 무시할 작업을 알리는 데 사용할 수있는 두 번째 대기열을 열어서 + 추가 제어/모니터링 정보를 제공하는 것입니다. 어쨌든 필요함).

AMQP 1.0 사양을 구현하는 RabbitMQ도 여기에서 도움이 될 수 있습니다.

그래서이 질문을 지금 답변으로 표시하겠습니다. 다른 누군가는 여전히 무료로 추가하거나 향상시킬 수 있습니다.

1

하나의 가능성은 제로 (다른 모든 메시지 버리는)이 될 응답 basic-ok.message-count에 대한 루프에서 basic.get를 사용하고 기다릴 수 있습니다 : 물론

while (<get ok> = <call basic.get>) { 
    if (<get ok>.message-count == 0) { 
    // Now <get ok> is the most recent message on this queue 
    break; 
    } else if (<is get-empty>) { 
    // Someone else got it 
    } 
} 

을, 당신은 메시지를 설정해야 할 것 브로커의 패턴을 라우팅하여 메시지를 버리는 1 명의 소비자가 다른 사람을 혼란에 빠뜨리지 않도록하십시오. 메시지가 스택 맨 위에 대기 할 때 메시지 대기열을 피하여 가장 최근 메시지처럼 보이게하십시오.

+0

답장을 보내 주셔서 감사합니다. 그러나 한 소비자가 다른 사람들을 굶주 리지 않기를 바랍니다.차라리 다른 소비자가 소비자 X가 대기열을 비우기 때문에 공회전 주위에 앉게하는 것보다 약간 더 최근의 메시지 (일부 정보를 제공함)로 작업하게 할 수 있습니다. 이것은 또한 내가 생각하는 메시지 속도에 달려 있지만. – dgorissen