Pregunta

Estoy usando ActiveMQ en una simulación de sobrecarga de servidores en Java. Y sobre todo sale bien, pero cuando recibo más de 600 solicitudes, ¡todo pasa a WTF!

Creo que el cuello de botella es mi servidor maestro, que es este tipo a continuación. Ya estoy reutilizando la conexión y creando varias sesiones para consumir mensajes de clientes. Como dije, estoy usando alrededor de 50-70 sesiones por conexión, reutilizando la conexión y la cola. ¿Alguna idea de lo que puedo reutilizar / optimizar de mis componentes / oyentes a continuación?

La arquitectura es la siguiente:

* = varios

Cliente --- > JMS MasterQueue --- > * Maestro --- > JMS SlavaQueue --- > * SlaveQueue

Principalmente estoy creando una cola temporal para cada sesión de Master - > Comunicación esclava, ¿es ese un gran problema en el rendimiento?

/**
 * This subclass implements the processing log of the Master JMS Server to
 * propagate the message to the Server (Slave) JMS queue.
 *
 * @author Marcos Paulino Roriz Junior
 *
 */
public class ReceiveRequests implements MessageListener {
    public void onMessage(Message msg) {
        try {
            ObjectMessage objMsg = (ObjectMessage) msg;

            // Saves the destination where the master should answer
            Destination originReplyDestination = objMsg.getJMSReplyTo();

            // Creates session and a sender to the slaves
            BankQueue slaveQueue = getSlaveQueue();
            QueueSession session = slaveQueue.getQueueConnection()
                    .createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
            QueueSender sender = session
                    .createSender(slaveQueue.getQueue());

            // Creates a tempQueue for the slave tunnel the message to this
            // master and also create a masterConsumer for this tempQueue.
            TemporaryQueue tempDest = session.createTemporaryQueue();
            MessageConsumer masterConsumer = session
                    .createConsumer(tempDest);

            // Setting JMS Reply Destination to our tempQueue
            msg.setJMSReplyTo(tempDest);

            // Sending and waiting for answer
            sender.send(msg);
            Message msgReturned = masterConsumer.receive(getTimeout());

            // Let's check if the timeout expired
            while (msgReturned == null) {
                sender.send(msg);
                msgReturned = masterConsumer.receive(getTimeout());
            }

            // Sends answer to the client
            MessageProducer producerToClient = session
                    .createProducer(originReplyDestination);
            producerToClient.send(originReplyDestination, msgReturned);
        } catch (JMSException e) {
            logger.error("NO REPLY DESTINATION PROVIDED", e);
        }
    }
}
¿Fue útil?

Solución

Bueno, después de leer un poco descubrí cómo optimizar.

Deberíamos reutilizar algunas variables de sesión, como el remitente y tempqueue. En lugar de crear nuevos.

Otro enfoque es colocar el tamaño de pila para el hilo en Java inferior, siguiendo este enlace ActiveMQ OutOfMemory no puede crear más hilos

Otros consejos

Podría tener que ver con la configuración del grupo de subprocesos de escucha. Podría ser que hasta un cierto número umbral de solicitudes por segundo, el oyente pueda mantener el ritmo y procesar las solicitudes entrantes de manera oportuna, pero por encima de esa tasa comienza a retrasarse. depende del trabajo realizado para cada solicitud entrante, la tasa de solicitud entrante, la memoria y la CPU disponibles para cada oyente y el número de oyentes asignados.

Si esto es cierto, debería poder ver la cola y ver cuándo comienza a copiarse el número de mensajes entrantes. Ese es el punto en el que necesita aumentar los recursos y la cantidad de oyentes para procesar de manera eficiente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top