Вопрос

Я использую ActiveMQ для симуляции перегрузки серверов в Java. И в основном все идет хорошо, но когда я получаю более 600 запросов, дело просто идет в WTF!

Я думаю, что узким местом является мой главный сервер, а этот парень ниже. Я уже повторно использую соединение и создаю различные сеансы для приема сообщений от клиентов. Как я уже сказал, я использую около 50-70 сеансов на соединение, повторно используя соединение и очередь. Любая идея о том, что я могу использовать / оптимизировать мои компоненты / слушатель ниже?

Архитектура следующая:

* = разные

Клиент --- > JMS MasterQueue --- > * Мастер --- > JMS SlavaQueue --- > * SlaveQueue

В основном я создаю временную очередь для каждой сессии мастера - > Связь с ведомыми, это большая проблема с производительностью?

/**
 * 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);
        }
    }
}
Это было полезно?

Решение

Ну, после некоторого чтения я узнал, как оптимизировать.

Мы должны повторно использовать некоторые переменные сеанса, такие как sender и tempqueue. Вместо создания новых.

Другой подход - поместить размер стека для потока в Java ниже, перейдя по этой ссылке. ActiveMQ OutOfMemory Невозможно создать больше потоков

Другие советы

Это может быть связано с конфигурацией пула потоков слушателя. Может случиться так, что до определенного порогового числа запросов в секунду слушатель сможет поддерживать и своевременно обрабатывать входящие запросы, но выше этой скорости он начинает отставать. это зависит от работы, выполненной для каждого входящего запроса, частоты входящих запросов, памяти и ЦП, доступных каждому слушателю, и количества выделенных слушателей.

Если это так, вы сможете увидеть очередь и посмотреть, когда количество входящих сообщений начнет резервное копирование. В этот момент вам нужно увеличить ресурсы и количество слушателей для эффективной обработки.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top