내 응용 프로그램에서 Cassandra Node js 드라이버를 사용하고 있습니다. 100k 레코드를 가져 오는 데 5.1 초 걸리지 만 동일한 것은 java 드라이버를 사용하여 2.7 초입니다. 아래 자바 및 노드 js 내 스키마 및 코드입니다.카산드라 노드 js 드라이버가 자바보다 느린 이유
카산드라 테이블 스키마
CREATE TABLE transactions_data (
app_name text,
api_name text,
app_id text,
start_time timestamp,
duration int,
end_time timestamp,
node_id text,
request_body text,
request_parameter_name1 text,
request_parameter_name2 text,
request_parameter_name3 text,
request_parameter_name4 text,
request_parameter_name5 text,
request_parameter_value1 text,
request_parameter_value2 text,
request_parameter_value3 text,
request_parameter_value4 text,
request_parameter_value5 text,
response_body text,
response_parameter_name1 text,
response_parameter_name2 text,
response_parameter_name3 text,
response_parameter_name4 text,
response_parameter_name5 text,
response_parameter_value1 text,
response_parameter_value2 text,
response_parameter_value3 text,
response_parameter_value4 text,
response_parameter_value5 text,
responsestatus text,
responsestatuscode text,
transaction_id text,
PRIMARY KEY ((app_name, api_name, app_id), start_time)
);
자바 코드
public class CassandraQueryPerformance {
private Cluster cluster;
private Session session;
private String query;
public CassandraQueryPerformance(String host,String query) throws
IOException {
this.query=query;
cluster = Cluster.builder().addContactPoints(host)
.withSocketOptions(new
SocketOptions().setConnectTimeoutMillis(2000000)).build();
session = cluster.connect();
}
public void performanceTest() throws IOException {
Statement statement = new SimpleStatement(query);
statement.setFetchSize(100000);
statement.setReadTimeoutMillis(650000).enableTracing();
ResultSet rs = session.execute(statement);
ArrayList<Row> list = new ArrayList<>();
for (com.datastax.driver.core.Row row : rs) {
list.add(row);
}
System.out.println("list count "+list.size());
}
public void close() {
cluster.close();
session.close();
}
public static void main(String[] args) throws IOException {
long startTime = System.currentTimeMillis();
CassandraQueryPerformance cqp = new
CassandraQueryPerformance(args[0],args[1]);
long onlyQueryTime = System.currentTimeMillis();
cqp.performanceTest();
System.out.println("total time without open close " +
(System.currentTimeMillis() - onlyQueryTime));
cqp.close();
System.out.println("total time " + (System.currentTimeMillis() -
startTime));
}
}
노드 JS 코드
'use strict';
const Hapi = require('hapi');
const cassandra = require('cassandra-driver');
const options1 = {
contactPoints: ['abcserver:9042'],
keyspace: 'demo'
}
const server = new Hapi.Server();
server.connection({
host: 'localhost',
port: 9999
});
// Add the route
server.route({
method: 'GET',
path:'/get-transaction',
handler: function (request, reply) {
let allResults = [];
//console.time('client_initialize');
var client = new cassandra.Client(options1);
// console.timeEnd('client_initialize');
var cqlQuery="SELECT start_time, end_time, duration FROM " +
"transactions_data WHERE app_name = 'app_name-100'"+
" AND api_name ='api_name-1'"+
" AND app_id='app_id_19999999' AND "+
" start_time >= '2017-03-20 13:40:29' AND "+
" start_time <= '2017-04-25 13:40:29' ";
client.connect(function(err, response) {
console.time('queryTime');
const options = { prepare : true , fetchSize : 100000};
let formattedRow;
client.eachRow(cqlQuery, {}, options, function (n, row) {
allResults.push(row);
}, function (err, result) {
if (result && result.nextPage) {
result.nextPage();
}
else{
console.timeEnd('queryTime');
console.log("Total no of records...",allResults.length);
reply('success');
}
reply('Hello '+request.query.limit);
});
});
}
});
server.start((err) => {
if (err) {
throw err;
}
console.log('Server running at:', server.info.uri);
});
결과는 NodeJS와 밀리 초
Number of records Node Java Difference
10k 846.232 494 352.232
20k 1115.307 624 491.307
30k 1603.353 897 706.353
40k 2124.656 1051 1073.656
50k 2626.624 1437 1189.624
60k 2940.313 1912 1028.313
70k 3478.797 1866 1612.797
80k 4293.986 2108 2185.986
90k 4677.516 2228 2449.516
100k 5175.231 2379 2796.231
Java 코드는 클래스를 참조하고 다른 클래스 인 CassandraQueryPerformance 및 CassandraQueryPerformanceTracing을 사용합니다. 또한 당신은 자바 주요 args에 사용하는 cql을 제공 할 수 있습니까? –
오타로 인해 사용 된 cql 쿼리는 java와 노드 j 모두 정확히 동일합니다 SELECT start_time, end_time, duration FROM transactions_data where app_name = 'app_name-100'AND api_name = 'api_name-1'AND app_id = 'app_id_19999999' AND start_time> = '2017-03-20 13:40:29'AND start_time <= '2017-04-25 13:40:29' 이 쿼리는 거의 100,000 개의 레코드를 가져옵니다. –
java와 node.js 결과가 모두 같아 보입니다. 100,000 개의 행에 대해 높이! 벤치마킹 팁 : 작게 시작하고 초기화 및 예열을 포함하지 마십시오. – jorgebg