2016-07-07 1 views
1

rabbitmq가 일괄 처리 승인과 함께 작동하는 방법에 대한 질문이있었습니다. Prefetch 값은 제한에 도달하기 전에 대기열에 들어갈 메시지의 최대 수임을 이해합니다. 그러나 나는 ack이 스스로를 관리하는지 또는 코드에서이를 관리해야하는지 확실하지 않았다.RabbitMQ 일괄 처리 ACK

올바른 방법은 무엇입니까?

가 여러 세트로 각 basicAck 보내기 진정한

또는

대기 (10 개)의 ACK를 발송하고 마지막 하나를 보낼 수하기로했다 및 AMQP가 자동으로 대기열에 이전의 모든 보내드립니다까지. (여러 값을 true로 설정 한 경우)

답변

1

Prefetch value is the max number of messages that will get queued before reaching its limit.과 관련된 첫 번째 수정 -이 값은 프리 페치 값과 다릅니다. prefetch 값은 소비자가 대기열에서 "가져 오는"UN-ACKed 메시지 수입니다. 그래서 그들은 소비자에게 일종의 할당을 받았지만 그들이 인정 될 때까지 대기열에 남아 있습니다. 견적 프리 페치이는 시간에 작업자에게 더 이상의 메시지를 제공하지 RabbitMQ를 알려줍니다 1

입니다 here에서. 또는 이전 메시지를 처리하고 확인하기 전까지는 새로운 메시지를 작업자에게 보내지 마십시오 ( ).

그리고 당신의 질문에 대한

는 :

나는 ACK의 자신을 관리하는 경우 확실하지 않았다 또는 내가 가지고있는 경우 코드에서 이 관리 할 수 ​​있습니다.

true로 자동 ACK 플래그를 설정할 수 있습니다 그리고 당신은 the ack's manage themselves

+0

여러 항목을 true로 설정하면 한 번에 수령 할 시점이나 수를 어떻게 알 수 있습니까? 그게 바로 API가 관리하는 것입니까? 아니면 그 시점에서 준비가되어있는 모든 것을 막을 수 있습니까? 만약 그렇다면 우리가 실제로 어떤 멍청이를 기다리게하고 싶다면 두 번째 경우는 적절하지 않을까요? – JeremyK

+0

기본 질문에 사과드립니다. AMQP에 대한 경험이 없으며 갑자기 성능을 향상시켜야합니다. – JeremyK

+0

@JeremyK 여러 항목에 대해 잘 모르겠습니다. 적절한 경우가 전혀없는 사용 사례가 없었습니다. 이것이 당신이 정말로 필요로하는 것이 확실합니까? 자동 응답으로 처리 할 수 ​​없습니까? 아니면 처리를 완료하면 즉시 하나씩 처리 할 수 ​​있습니까? – cantSleepNow

1

TL 말할 수 있습니다, DR 여러 = 사실은 빠른 경우에 있지만 요구 사항과 같은 더 많은주의 회계 및 배치를 요구한다

소비자는 해당 소비자에 따라 단조로운 성장 ID를 가진 메시지를받습니다. ID는 배달 태그라는 64 비트 숫자입니다 (실제로는 부호없는 32 비트가 될 수 있지만 Java에는 길이가 없습니다). 프리 페치는 소비자가받지 못한 가장 많은 메시지입니다.

true이 여러 개인 최고 배달 태그를 확인하면 소비자가 처리하지 못한 모든 배달되지 않은 메시지 (작은 숫자)로 확인됩니다. 분명히 높은 프리 페치가 있으면 각 메시지를 확인하는 것보다 빠릅니다.

이제 RabbitMQ는 소비자가 메시지 (받지 못한 메시지)를 수신했음을 알고 있지만 모든 메시지가 올바르게 소비되었는지는 알 수 없습니다. 따라서 모든 이전 메시지가 사용되었는지 개발자에게 알려줘야합니다. 소비자는 순서대로 메시지를 전달할 것이다 (클라이언트가 내부적으로 BlockingQueue를 사용한다고 믿는다.)하지만 메시지가 아닐 수도있는 다운 스트림에 사용되는 라이브러리/클라이언트에 따라 다르다.

이렇게하면 메시지를 일괄 처리 (예 : 거래 또는 다른 시스템으로 보내는 메시지 그룹 전송)하거나 안정적으로 버퍼링 할 때만 효과적입니다. 대개 블로킹 큐를 사용하고 큐를 주기적으로 배수시켜 일련의 메시지를 다운 스트림 시스템에 전송합니다.

반면에 실시간으로 각 메시지를 스트리밍하는 경우 실제로는이 작업을 수행 할 수 없습니다 (예 : multiple = false).

그룹에 메시지가 잘못되었습니다 (예 : 내부 대기열에서 빠져 나왔습니다 ... 토끼 대기열이 아님). 그 나쁜 것을 잠그지 않을 것입니다. 이 경우 복수 = true 중 하나를 사용할 수 없습니다.

마지막으로 미리 계산 한 것보다 일정량의 메시지 (시간이 아니라)를 기다리는 경우 무기한 기다릴 것입니다. 좋은 아이디어는 아닙니다. 대기 시간이 필요하며 메시지 수는 <=이어야합니다.

정확히 알다시피 다중을 정확히 사용하려면 = true을 사용하십시오.