2011-10-04 25 views
5

Buscando ayuda sobre la configuración del sistema y la configuración de destinationPolicy ya que tengo algunas dificultades para entender completamente la relación entre systemUsage, destinationPolicy y control de flujo.ActiveMQ destinationPolicy y SystemUsage Configuration

Todos nuestros mensajes son persistentes! producerFlowControl está activado.

Le damos a ActiveMQ un espacio máximo de almacenamiento de 512MB.

Nuestra systemUsage se establece de la siguiente manera:

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

Nuestra política de destino de la siguiente manera:

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

¿Alguien puede verificar el si el siguiente es correcta:

Esto significa que para cada cola individual/tema el límite de memoria es 1MB. ¿Qué sucede exactamente cuando se golpea este 1MB, bloquea la cola para los productores o hace una página al disco?

La memoria total permitida para todas las colas y temas es de 200 MB. Lo que significa que podríamos tener 200 canales operando a su capacidad máxima de 1MB. Actualmente tenemos 16 colas y temas en total, por lo que obviamente nunca se alcanza.

¿Es mejor eliminar la entrada de política individual en el límite de memoria y compartir la memoria entre los distintos canales?

Si hacemos esto ¿en qué punto bloquearían?

Cualquier ayuda muy apreciada! ¿Puede pagarle un poco de dinero de cerveza?

Respuesta

6

Estás tocando una serie de puntos aquí, que responderé fuera de orden.

memoryUsage corresponde a la cantidad de memoria asignada al almacén en memoria. storeUsage corresponde a cuánto espacio se debe dar a la tienda KahaDB. Puede usar uno u otro, dependiendo de cómo quiera que su intermediario persista mensajes o no. tempUsage es un caso especial para cursores de archivos (http://activemq.apache.org/message-cursors.html) - un mecanismo para desbordar la memoria desde el almacenamiento en memoria en el disco si se excede el límite de memoria (debe configure este comportamiento en el nivel de destino si lo desea).

policyEntry @ memoryLimit es un sublímite para destinos individuales.

Lo que sucede cuando se exceden los límites de memoria depende de si el control de flujo del productor (PFC) está encendido. Está activado por defecto para colas, desactivado para temas y envíos asíncronos a colas; todo esto se puede configurar en policyEntry (http://activemq.apache.org/per-destination-policies.html).

Si alcanza un "límite de memoria" cuando PFC está activado, sus clientes bloquearán hasta que alguien libere espacio al consumir mensajes de la tienda. Si está desactivado, el envío arrojará una excepción (es mejor que el cliente se caiga que el intermediario). "Límite de memoria" significa el definido por el uso de la memoria en todas las colas, o el límite específico de la cola (es posible pulsar el anterior antes que el último).

Si desea o no un límite específico de destino depende de su caso de uso. Sugeriría ignorarlo a menos que intentes lograr un resultado específico.

+0

Como nota, si alcanza un límite de memoria, la cola también aparece "vacía" para los consumidores que han realizado la transacción, hasta que otra persona libere espacio. Además, los cursores solo son útiles básicamente para "almacenar mensajes no persistentes si te quedas sin memoryLimit", ¿verdad? – rogerdpack

Cuestiones relacionadas