Java >> Tutorial de Java >  >> Java

ActiveMQ - Explicación de la red de corredores - Parte 3

Ahora que hemos entendido los conceptos básicos del conector de red ActiveMQ en las partes 1 y 2 de esta serie de blogs, en esta parte 3 examinaremos cómo equilibra la carga ActiveMQ a los consumidores que se conectan a una red de intermediarios.

Introducción

Los consumidores simultáneos se utilizan cuando los mensajes en una cola se pueden procesar desordenadamente y, por lo general, para mejorar el rendimiento de los mensajes. El agente de ActiveMQ envía mensajes por turnos entre los consumidores para equilibrar la carga del consumo de mensajes entre los consumidores simultáneos, a menos que el consumidor se especifique como exclusivo.

Veamos el siguiente ejemplo en el que tres consumidores procesan simultáneamente mensajes de la cola foo.bar. Un productor pone en cola 60 mensajes que son procesados ​​por tres consumidores (20 cada uno) en forma rotativa.

Inicie tres consumidores simultáneos en la cola foo.bar

Ashwinis-MacBook-Pro:example akuntamukkala$ pwd
/Users/akuntamukkala/apache-activemq-5.8.0/example
Ashwinis-MacBook-Pro:example akuntamukkala$ ant consumer -Durl=tcp://localhost:61616 -Dtopic=false -Dsubject=foo.bar -DparallelThreads=3 -Dmax=20

Produce 60 mensajes

Ashwinis-MacBook-Pro:example akuntamukkala$ ant producer -Durl=tcp://localhost:61616 -Dtopic=false -Dsubject=foo.bar -Dmax=60

La siguiente captura de pantalla muestra 3 consumidores procesando mensajes de la cola foo.bar. 60 mensajes fueron puestos en cola y eliminados.

Como se muestra a continuación, cada uno de los consumidores procesó 20 mensajes.

El siguiente extracto del registro muestra que los mensajes se dividen entre tres consumidores...

[Thread-3] Received: 'Message: 1 sent at: Tue Mar 04 13:46:53 IST 2014  ...' (length 1000)

[Thread-2] Received: 'Message: 0 sent at: Tue Mar 04 13:46:53 IST 2014  ...' (length 1000)

[Thread-1] Received: 'Message: 2 sent at: Tue Mar 04 13:46:53 IST 2014  ...' (length 1000)

[Thread-3] Received: 'Message: 4 sent at: Tue Mar 04 13:46:53 IST 2014  ...' (length 1000)

[Thread-2] Received: 'Message: 3 sent at: Tue Mar 04 13:46:53 IST 2014  ...' (length 1000)

[Thread-1] Received: 'Message: 5 sent at: Tue Mar 04 13:46:53 IST 2014  ...' (length 1000)

[Thread-3] Received: 'Message: 7 sent at: Tue Mar 04 13:46:53 IST 2014  ...' (length 1000)

[Thread-2] Received: 'Message: 6 sent at: Tue Mar 04 13:46:53 IST 2014  ...' (length 1000)

[Thread-1] Received: 'Message: 8 sent at: Tue Mar 04 13:46:53 IST 2014  ...' (length 1000)

[Thread-3] Received: 'Message: 10 sent at: Tue Mar 04 13:46:53 IST 2014 ...' (length 1000)

Ahora que hemos visto cómo funcionan los consumidores simultáneos en un solo bróker, ahora examinaremos cómo funcionan cuando los consumidores están dispersos en la red de brókeres.

Consumidores locales versus remotos

Exploremos cómo ActiveMQ maneja a los consumidores locales y remotos con la ayuda de una configuración que se muestra en la figura a continuación.

Consumer-1 y Consumer-2 consumen mensajes de la cola foo.bar en Broker-1 y Broker-2 respectivamente. El intermediario 1 estableció un conector de red con el intermediario 2 para reenviar los mensajes de la cola. El productor pone en cola los mensajes en la cola foo.bar en Broker-1

Veamos esto en acción

  • Edite la configuración de Broker-1 /Users/akuntamukkala/apache-activemq-5.8.0/bridge-demo/broker-1/conf/activemq.xml y abra un conector de red para Broker-2 y reinicie Broker-1 y Broker -2
<networkConnectors>
                <networkConnector
                        name="T:broker1->broker2"
                        uri="static:(tcp://localhost:61626)"
                        duplex="false"
                        decreaseNetworkConsumerPriority="false"
                        networkTTL="2"
                        dynamicOnly="true">
                        <excludedDestinations>
                                <queue physicalName=">" />
                        </excludedDestinations>
                </networkConnector>
                <networkConnector
                        name="Q:broker1->broker2"
                        uri="static:(tcp://localhost:61626)"
                        duplex="false"
                        decreaseNetworkConsumerPriority="false"
                        networkTTL="2"
                        dynamicOnly="true">
                        <excludedDestinations>
                                <topic physicalName=">" />
                        </excludedDestinations>
                </networkConnector>
        </networkConnectors>
  • Iniciar consumidor local, Consumidor-1
Ashwinis-MacBook-Pro:example akuntamukkala$ ant consumer -Durl=tcp://localhost:61616 -Dtopic=false -Dsubject=foo.bar
  • Iniciar consumidor remoto, Consumidor-2
Ashwinis-MacBook-Pro:example akuntamukkala$ ant consumer -Durl=tcp://localhost:61626 -Dtopic=false -Dsubject=foo.bar
  • Iniciar productor en Broker-1 para poner en cola 100 mensajes
Ashwinis-MacBook-Pro:example akuntamukkala$ ant producer -Durl=tcp://localhost:61616 -Dtopic=false -Dsubject=foo.bar -Dmax=100

Captura de pantalla que muestra las colas de Broker-1:

Miremos a los consumidores para ver cómo se han repartido los mensajes.

Como puede notar, el agente ActiveMQ envía los mensajes por igual al consumidor local que al consumidor remoto, dándoles la misma prioridad.

El consumidor remoto, el Consumidor-2, está a solo 1 salto del intermediario, que es menor que el valor configurado de redTTL de 2.

Esto conduce a rutas subóptimas, especialmente cuando los intermediarios están conectados de manera que son posibles múltiples rutas entre productores y consumidores. Es preferible despachar a los consumidores locales que a los consumidores remotos para garantizar el camino más corto entre los productores y los consumidores.

ActiveMQ proporciona una forma de configurar la prioridad entre el consumidor local y el consumidor remoto mediante la propiedad
decreaseNetworkConsumerPriority en el conector de red.

De forma predeterminada, este valor es falso y, por lo tanto, los intermediarios locales y remotos se trataron de la misma manera.

Si repetimos los pasos anteriores después de cambiar la disminuciónNetworkConsumerPriority=”true”, entonces encontramos que el consumidor local, el Consumidor-1, tiene preferencia sobre el consumidor remoto, el Consumidor-2, que está a 1 salto de intermediario.


ActiveMQ descubre de forma inteligente la ruta más corta en una red de intermediarios entre los productores de mensajes y los consumidores.

Lea el siguiente enlace para comprender mejor el enrutamiento óptimo de ActiveMQ.

  • http://fusesource.com/docs/esb/4.3/amq_clustering/Networks-OptimizingRoutes.html

Esto concluye la parte 3 de esta serie donde vimos cómo diferenciar los consumidores locales y remotos para ayudar a ActiveMQ a determinar la ruta más óptima entre los productores de mensajes y los consumidores.

Como siempre tus comentarios son muy bienvenidos.

Estén atentos a la parte 4, donde repasaremos el balanceo de carga de los consumidores simultáneos remotos...

Etiqueta Java