elasticsearch 将行从文件路由到持久JMS队列:如何提高性能?,elasticsearch,apache-camel,activemq,elasticsearch,Apache Camel,Activemq" /> elasticsearch 将行从文件路由到持久JMS队列:如何提高性能?,elasticsearch,apache-camel,activemq,elasticsearch,Apache Camel,Activemq" />

elasticsearch 将行从文件路由到持久JMS队列:如何提高性能?

elasticsearch 将行从文件路由到持久JMS队列:如何提高性能?,elasticsearch,apache-camel,activemq,elasticsearch,Apache Camel,Activemq,我需要一些关于用例性能调优的帮助。在这个用例中,驼峰路由跟踪日志文件中的状态行,并将每一行作为消息发送到JMS队列。我实现了如下用例: package tests; import java.io.File; import java.net.URI; import org.apache.activemq.ActiveMQConnectionFactory; import org.apache.activemq.broker.BrokerFactory; import org.apache.ac

我需要一些关于用例性能调优的帮助。在这个用例中,驼峰路由跟踪日志文件中的状态行,并将每一行作为消息发送到JMS队列。我实现了如下用例:

package tests;

import java.io.File;
import java.net.URI;

import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.broker.BrokerFactory;
import org.apache.activemq.broker.BrokerService;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.sjms.SjmsComponent;
import org.apache.camel.main.Main;

public class LinesToQueue {

    public static void main() throws Exception {

        final File file = new File("data/log.txt");
        final String uri = "tcp://127.0.0.1:61616";

        final BrokerService jmsService = BrokerFactory.createBroker(new URI("broker:" + uri));
        jmsService.start();

        final SjmsComponent jmsComponent = new SjmsComponent();
        jmsComponent.setConnectionFactory(new ActiveMQConnectionFactory(uri));

        final Main main = new Main();
        main.bind("jms", jmsComponent);
        main.addRouteBuilder(new RouteBuilder() {
            @Override
            public void configure() throws Exception {
                fromF("stream:file?fileName=%s&scanStream=true&scanStreamDelay=0", file.getAbsolutePath())
                        .routeId("LinesToQueue")
                        .to("jms:LogLines?synchronous=false");
            }
        });

        main.enableHangupSupport();
        main.run();
    }

}
当我在一个已经填充了1.000.000行的文件中运行这个用例时,我得到的总体性能大约是313行/秒。这意味着处理该文件大约需要55分钟

作为某种参考,我还创建了另一个用例。在这个用例中,驼峰路径跟踪日志文件中的状态行,并将每一行作为文档发送到Elasticsearch索引。我实现了如下用例:

package tests;

import java.io.File;

import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.main.Main;

public class LinesToIndex {

    public static void main() throws Exception {

        final File file = new File("data/log.txt");
        final String uri = "local";

        final Main main = new Main();
        main.addRouteBuilder(new RouteBuilder() {
            @Override
            public void configure() throws Exception {
                fromF("stream:file?fileName=%s&scanStream=true&scanStreamDelay=0", file.getAbsolutePath())
                        .routeId("LinesToIndex")
                        .bean(new LineConverter())
                        .toF("elasticsearch://%s?operation=INDEX&indexName=log&indexType=line", uri);
            }
        });

        main.enableHangupSupport();
        main.run();
    }

}
当我在一个已经填充了1.000.000行的文件中运行这个用例时,我在路由中得到的总体性能大约是8333行/秒。这意味着处理该文件大约需要2分钟

我知道JMS队列和Elasticsearch索引之间有着巨大的区别,但是如何让上面的JMS用例表现得更好呢

更新#1:

在我上面的第一个用例中,JMS服务中的持久性似乎是瓶颈。如果我在JMS服务中禁用持久性,那么路由中的性能大约为11111行/秒。JMS服务的持久存储将给我带来更好的性能?

< P>一些要考虑的事情…

  • ActiveMQ生产者连接,请确保使用池连接工厂

  • 考虑对进程内ActiveMQ实例使用

  • 考虑通过TCP使用外部ActiveMQ代理(这样它就不会与您的测试争夺资源)

  • 设置/调优KahaDB或LevelDB以优化您的用例的持久存储


谢谢您的回答。对于这个用例,我已经尝试了各种JMS组件,包括连接池和不连接池,但对我来说,JMS服务中的持久性存储仍然是这个用例中的瓶颈。删除持久性将使吞吐量从313行/秒提高到11111行/秒,而无需其他更改。非持久性肯定更快,但如果您需要持久性,我不排除ActiveMQ…正确设置时,它能够实现非常快的吞吐量…更新了答案,并提供了一些其他想法