Come ottimizzare activemq
-
05-07-2019 - |
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);
}
}
}
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.