elasticsearch 将行从文件路由到持久JMS队列:如何提高性能?
我需要一些关于用例性能调优的帮助。在这个用例中,驼峰路由跟踪日志文件中的状态行,并将每一行作为消息发送到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
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以优化您的用例的持久存储