Проблема производительности с верблюдом "компонент activemq" - PullRequest
0 голосов
/ 24 сентября 2019

Я пытался работать с компонентом ActiveMQ (внутри Spring-Boot), и я получил странный результат.

1 - Я отправил 2000 сообщений из SEDA на destinationQueue

Вот как я это сделал:

from("file:G:/highlight").to("seda:warehouse");
// took less than a millisecond to complete



from("seda:warehouse?concurrentConsumers=20").to("activemq:queue:destinationQueue") 
// Completion time : 58 seconds

Completion time : 58 seconds

2 - Теперь я пытаюсь использовать эти файлы из destinationQueue, и вот как я собираюсь это сделать:

        from("activemq:queue:line1").process(new Processor() {
            @Override
            public void process(Exchange exchange) throws Exception {
                System.out.println(exchange.getIn().getBody(String.class));
            }
        });  
// The completion time : around 1 second!
The completion time : around 1 second!

Итак, мой вопрос:

1- Почему скорость очень низкая, когда я отправляю файлы в очередь?Но я могу получать эти сообщения так быстро (в этом тесте это было более чем в 50 раз быстрее) !!!

  • Я потреблял и производил оба на своем ноутбуке.

Любая помощь будет очень признателен:))

1 Ответ

0 голосов
/ 24 сентября 2019

Я нашел это благодаря @ Alexey-yakunin :)

Когда вы работаете с ActiveMQ, если вашим пунктом назначения является «очередь», то скорость создания сообщений в очередь является очень высокоймедленнее, чем потреблять из очереди.Это потому, что, как @ Alexey-yakunin сказал «когда вы отправляете сообщения в очередь ActiveMQ, вы помещаете их в базу данных. База данных находится на вашем жестком диске (узкое место). Чтение из базы данныхбыстрее, чем писать в него ".

Итак, чтобы доказать эту теорию, я сделал этот тест:

(Вместо отправки сообщений на queue я отправил их на topic без каких-либо длительныхподписчики)

No durable subscribers to the topic == No databse

        from("file:G:/highlight").to("activemq:topic:newVersion");
        from("activemq:topic:newVersion").process(new Processor() {
            @Override
            public void process(Exchange exchange) throws Exception {
                long time = System.currentTimeMillis();
                Date date = new Date(time);
                System.out.println(date);

            }
        });

Для 2000 messages Потребовалось всего 3 seconds для создания и потребления всех сообщений.

Также это параметры, которые я установил при весенней загрузке application.properties, чтобы получить максимальную отдачу от activemq:

camel.component.activemq.broker-u-r-l=tcp://localhost:61616

// By default it is set to false so make sure you set this to true
camel.component.activemq.use-pooled-connection=true 

camel.component.activemq.transacted=false

//Remember, the messages will be lost if the broker crashes or is restarted.
camel.component.activemq.delivery-persistent=false

camel.component.activemq.wait-for-provision-correlation-to-be-updated-thread-sleeping-time=50

Есть два других параметра, которые стимулируют вас изменять их значение,но я нашел их в лучшем случае, когда они установлены со значениями по умолчанию:

camel.component.activemq.concurrent-consumers
camel.component.activemq.max-concurrent-consumers

Вот и все:))

...