2011-10-04 3 views
5

systemUsage, destinationPolicy 및 flow control 간의 관계를 완전히 이해하는 데 어려움을 겪고 있으므로 systemUsage 및 destinationPolicy 구성에 대한 도움이 필요합니다.ActiveMQ destinationPolicy 및 systemUsage 구성

우리의 모든 메시지는 영속입니다! producerFlowControl이 켜져 있습니다.

그래서 우리는 ActiveMQ에 최대 512MB 힙 공간을 말합니다.

우리 systemUsage은 다음과 같이 설정됩니다 아래

<systemUsage> 
    <systemUsage> 
     <memoryUsage> 
      <memoryUsage limit="200 mb"/> 
     </memoryUsage> 
     <storeUsage> 
      <storeUsage limit="10 gb"/> 
     </storeUsage> 
     <tempUsage> 
      <tempUsage limit="1000 mb"/> 
     </tempUsage> 
    </systemUsage> 
</systemUsage> 

우리의 목적지 정책 :

<destinationPolicy> 
    <policyMap> 
     <policyEntries> 
     <policyEntry topic=">" producerFlowControl="true" memoryLimit="1mb"> 
      <pendingSubscriberPolicy> 
      </pendingSubscriberPolicy> 
     </policyEntry> 
     <policyEntry queue=">" producerFlowControl="true" memoryLimit="1mb"> 
     </policyEntry> 
     </policyEntries> 
    </policyMap> 
</destinationPolicy> 

사람은 다음이 정확한지 확인할 수 :

이는 것을 의미한다 각 개별 대기열/주제 메모리 제한은 1MB입니다. 이 1MB가 히트 될 때 정확히 무슨 일이 일어나는가, 생산자를위한 대기열 블록은 디스크에 기록 하는가?

모든 대기열 및 주제에 허용되는 총 메모리는 200MB입니다. 우리는 200 개의 채널이 1MB의 전체 용량에서 작동 할 수 있음을 의미합니다. 우리는 현재 총 16 개의 대기열과 주제를 가지고 있으므로 분명히 도달하지 못했습니다.

메모리 제한에 대한 개별 정책 항목을 제거하고 다양한 채널간에 메모리를 공유하는 것이 더 좋습니까?

우리는 어떤 시점에서이를 차단합니까?

도움을 주시면 대단히 감사하겠습니다! 페이팔로 맥주 한 잔 할 수 있어요!

답변

6

여기서 여러 가지 사항을 다루고 있습니다.

memoryUsage는 메모리 내장 저장소에 할당 된 메모리 양에 해당합니다. storeUsage는 KahaDB 상점에 제공되어야하는 공간의 양에 해당합니다. 브로커가 메시지를 유지하는 방법에 따라 둘 중 하나를 사용합니다. tempUsage는 파일 커서 (http://activemq.apache.org/message-cursors.html)의 특별한 경우입니다. 메모리 제한을 초과하면 메모리 내 저장소에서 디스크로 메모리를 오버플로하는 메커니즘입니다. 원하는 경우 대상 수준에서이 동작을 구성하십시오.

policyEntry @ memoryLimit는 개별 대상의 하위 제한입니다.

메모리 제한을 초과하면 PFC (생산자 흐름 제어)가 켜져 있는지 여부에 따라 달라집니다. 기본적으로 대기열에는 사용 설정되어 있으며, 주제에는 사용 안함, 대기열에 비동기 전송이 설정되어 있습니다. 이 모든 것은 policyEntry (http://activemq.apache.org/per-destination-policies.html)에서 구성 할 수 있습니다.

PFC가 켜져있을 때 "메모리 제한"에 도달하면 클라이언트가 저장소에서 메시지를 소비하여 공간을 확보 할 때까지 클라이언트가 차단됩니다. 꺼져 있으면 보내기가 예외를 throw합니다 (클라이언트가 브로커보다 떨어지는 것이 더 낫습니다). "메모리 제한"은 모든 대기열에 걸쳐 memoryUsage로 정의 된 대기열 제한 또는 대기열 특정 한도 (이전에 대기열에 도달 할 수 있음)를 의미합니다.

대상 특정 제한을 적용할지 여부는 사용 사례에 따라 다릅니다. 나는 당신이 특별한 결과를 얻으려고하지 않는다면 그것을 무시하도록 제안 할 것입니다.

+0

메모로 메모리 제한에 도달하면 다른 사람이 공간을 확보 할 때까지 대기열이 트랜잭션 된 소비자에게 "비어있는"것으로 표시됩니다. 또한 - 커서는 기본적으로 "memoryLimit을 모두 사용하면 비 지속 메시지 저장소"에 유용합니다. – rogerdpack

관련 문제