4

我在用 Java 模拟重载服务器时使用 ActiveMQ。主要是没问题,但是当我收到超过 600 个请求时,事情就发生了 WTF!

我认为瓶颈是我的主服务器,也就是下面的这个人。我已经在重用连接并创建各种会话来使用来自客户端的消息。就像我说的,我每个连接使用大约 50-70 个会话,重新利用连接和队列。知道我可以在下面重用/优化我的组件/侦听器吗?

架构如下:

* = 各种

客户端---> JMS MasterQueue ---> * Master ---> JMS SlavaQueue ---> * SlaveQueue

主要是我为 Master 的每个会话创建一个 Temp Queue --> Slave 通信,这对性能来说是个大问题吗?

/**
 * 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);
        }
    }
}
4

2 回答 2

2

好吧,经过一番阅读,我发现了如何优化。

我们应该重用一些会话变量,例如发送者和临时队列。而不是创造新的。

另一种方法是降低Java中线程的堆栈大小,遵循此链接 ActiveMQ OutOfMemory Can't create more threads

于 2009-11-28T15:19:18.493 回答
1

它可能与侦听器线程池的配置有关。可能是在每秒达到一定阈值数量的请求时,侦听器能够及时跟上并处理传入的请求,但高于该速率它开始落后。它取决于每个传入请求所做的工作、传入请求速率、每个侦听器可用的内存和 CPU 以及分配的侦听器数量。

如果这是真的,您应该能够观察队列并查看传入消息的数量何时开始备份。这就是您需要增加资源和侦听器数量以有效处理的点。

于 2009-11-26T00:02:56.043 回答