2017-05-10 1 views
0

내 응용 프로그램에서 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 
+0

Java 코드는 클래스를 참조하고 다른 클래스 인 CassandraQueryPerformance 및 CassandraQueryPerformanceTracing을 사용합니다. 또한 당신은 자바 주요 args에 사용하는 cql을 제공 할 수 있습니까? –

+0

오타로 인해 사용 된 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 개의 레코드를 가져옵니다. –

+1

java와 node.js 결과가 모두 같아 보입니다. 100,000 개의 행에 대해 높이! 벤치마킹 팁 : 작게 시작하고 초기화 및 예열을 포함하지 마십시오. – jorgebg

답변

1

시작에 단일 스레드입니다 캡처 및 자바 드라이버는 안된다. 이로 인해 NodeJS에서 CPU 집약적 인 작업 (예 : Cassandra 레코드의 압축 풀기 또는 구문 분석)이 느려질 수 있습니다.

드라이버 구현 수준에는 클라이언트 측에서 레코드 구성으로 연결하고 완료하는 데 걸리는 시간부터 많은 차이가있을 수 있습니다. 예를 들어 데이터 전송에 압축을 사용하거나 사용하지 않는 것과 같이 기본값에서도 많은 차이가있을 수 있습니다.

저는 파이썬으로 테스트를 실행하고 이동하여 많은 워크 플로를 거쳐 x10 성능을 얻었습니다. NodeJS와 Java는 매우 다른 언어이며, Java는 기본적으로 더 나은 성능을 제공해야합니다.

관련 문제