2013-09-25 1 views
0

안녕하세요 저는 RabbitMQ에 연결하기 위해 현재 봄 AMQP API를 사용하고 있습니다. 기본적으로 소비자 코드에서 비동기 적으로 메시지를 읽고 탄성 검색에 대량 삽입을하고 있습니다. 나는 ack = AUTO 일 때 400-500 msg/sec의 적당한 속도를 얻는다. 나는 ack = NONE을 할 때 읽기 속도가 빨라진다. 즉 5000-6000 msg/sec로 증가한다. 내가 ACK를하고있는 중이 야 때 32기가바이트 RAM JVM 인수와 함께 리눅스 머신을 다음과 같이RabbitMQ 용 Spring Integration QueueChannel 구성

하드웨어 구성이 -server -Xms1g -Xmx1g -Xss384k PermSize = 256m를 MaxPermSize = 256m

지금 문제가 = NONE 비록 JVM이 OutOfMemory를 얼마 동안 얻었는지 알 수는 있지만이 시나리오에서는 많은 GC가 발생하는 것을 볼 수 있습니다.

얼마나 많은 메시지를 포함 할 수 있는지에 따라 채널 크기를 제한 할 수있는 Spring 통합의 QueueChannel을 사용할 계획입니다.

사람은 어떻게 RabbitMQ와이를 구현하는 모든 도움이 높게 평가 된 JVM

충돌없이 4000-5000 MSG/초와 같은 좋은 읽기 속도를 달성하기 위해 다른 방법이 말해 수 있습니다.

감사 Shantanoo K

답변

1

ack=AUTO를 사용해보십시오 있지만, prefetchtxSize에 1000라고 설정; 그렇게하면 ack는 1000 개의 메시지마다 전송됩니다 (필요에 따라이 값을 조정할 수 있음).

ackmode = NONE을 사용하면 수신기 컨테이너 내의 제한되지 않은 차단 대기열에 메시지가 누적되고 수신기가 계속 유지할 수있는 경우에만 메시지가 누적됩니다 (OOM은 사용자가 유지할 수 없음을 의미).

ack = NONE에 대해이 문제를 해결하기 위해 open JIRA issue이 있지만 일반적으로 위의 기술로 충분합니다.

컨테이너 동시성 설정을 사용하여 처리량을 향상시킬 수도 있습니다.

+0

이미 프리 페치 카운트가 750이지만, txSize를 사용하지 않습니다. (어떤 효과가 있습니까?) 또한 크기 제한이 있기 때문에 RabbitMQ와 Spring 통합의 QueueChannel을 사용할 수 있습니다. –

+1

'txSize' 참조 설명서에서 : "acknowledgeMode AUTO와 함께 사용하면 컨테이너는 ack를 보내기 전에이 수만큼의 메시지를 처리하려고 시도합니다 (대기 중 각각의 수신 타임 아웃 설정까지). 이것은 트랜잭션 채널이 커밋 된 경우에도 마찬가지입니다 .prefetchCount가 txSize보다 작 으면 txSize와 일치하도록 증가합니다. "SI QueueChannel을 사용하면 이 시나리오에서는 메모리 사용량이 리스너 컨테이너 안에 있습니다. –