سؤال

وأنا باستخدام ActiveMQ على محاكاة الحمولة الزائدة الملقمات في جاوة. وأساسا أنه غني طيب، ولكن عندما أحصل على أكثر من 600 طلب الشيء اذهبوا WTF!

وأعتقد أن هذا الاختناق بلدي خادم ماستر وهو هذا الرجل أدناه. انا إعادة استخدام بالفعل الاتصال وخلق دورات مختلفة لتستهلك الرسائل من العملاء. كما قلت، أنا باستخدام حوالي 50-70 جلسات لكل اتصال، reutilizing الاتصال والانتظار. أي فكرة عما يمكنني إعادة استخدام / الأمثل من مكونات بلادي / المستمع أدناه؟

وبنية هو التالي:

و* = مختلف

والعميل ---> 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);
        }
    }
}
هل كانت مفيدة؟

المحلول

حسنا، وبعد القراءة اكتشفت كيفية تحسين.

ويجب علينا إعادة استخدام بعض المتغيرات الدورة، مثل المرسل وtempqueue. بدلا من إنشاء أخرى جديدة.

ويتم وضع نهج آخر حجم مكدس للموضوع في جاوة أقل من ذلك، اتباع هذا الرابط ActiveMQ OutOfMemory لا يمكن خلق المزيد من المواضيع

نصائح أخرى

ويمكن أن يكون لها علاقة مع تكوين تجمع مؤشرات الترابط المستمع. ويمكن أن يكون ما يصل الى عدد عتبة معينة من الطلبات في الثانية المستمع قادرة على مواكبة ومعالجة الطلبات الواردة في الوقت المناسب، ولكن قبل أن معدل يبدأ في الانخفاض وراء. ان ذلك يعتمد على العمل المنجز لكل طلب وارد، ومعدل الواردة الطلب، وذاكرة وحدة المعالجة المركزية المتوفرة لكل مستمع، وعدد من المستمعين المخصصة.

وإذا كان هذا صحيحا، يجب أن تكون قادرا على مشاهدة قائمة الانتظار وعندما انظر الى عدد من الرسائل الواردة بدء إجراء النسخ الاحتياطي. هذه هي النقطة التي تحتاج إلى زيادة الموارد وعدد من المستمعين لمعالجة بكفاءة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top