Domanda

Sto usando ActiveMQ su una simulazione di sovraccarico di server in Java. E soprattutto va bene, ma quando ricevo oltre 600 richieste la cosa va semplicemente WTF!

Penso che il collo di bottiglia sia il mio Master Server che è questo ragazzo qui sotto. Sto già riutilizzando la connessione e creando varie sessioni per consumare messaggi dai client. Come ho detto, sto usando circa 50-70 sessioni per connessione, riutilizzando la connessione e la coda. Qualche idea su cosa posso riutilizzare / ottimizzare i miei componenti / ascoltatore di seguito?

L'architettura è la seguente:

* = vari

Client --- > JMS MasterQueue --- > * Master --- > JMS SlavaQueue --- > * SlaveQueue

Principalmente sto creando una coda temporanea per ogni sessione di Master - > Comunicazione schiava, è un grosso problema per le prestazioni?

/**
 * 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);
        }
    }
}
È stato utile?

Soluzione

Bene, dopo alcune letture ho scoperto come ottimizzare.

Dovremmo riutilizzare alcune variabili di sessione, come mittente e tempqueue. Invece di crearne di nuovi.

Un altro approccio è quello di ridurre le dimensioni dello stack per il thread in Java, seguendo questo link ActiveMQ OutOfMemory Impossibile creare più thread

Altri suggerimenti

Potrebbe avere a che fare con la configurazione del pool di thread del listener. È possibile che fino a un determinato numero di richieste al secondo l'ascoltatore sia in grado di tenere il passo e di elaborare le richieste in arrivo in modo tempestivo, ma al di sopra di tale frequenza inizia a rimanere indietro. dipende dal lavoro svolto per ogni richiesta in arrivo, dalla percentuale di richieste in entrata, dalla memoria e dalla CPU disponibili per ciascun ascoltatore e dal numero di ascoltatori assegnati.

Se questo è vero, dovresti essere in grado di guardare la coda e vedere quando il numero di messaggi in arrivo inizia a eseguire il backup. Questo è il punto in cui è necessario aumentare le risorse e il numero di ascoltatori per elaborare in modo efficiente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top