2017-03-03 5 views
0

일부 서버 측 작업을 처리하기 위해 firebase-queue을 사용하고 있습니다. 사용자가 등록하면 서버는 세 가지 작업을 처리합니다.Firebase 대기열 지연 - 성능 문제

var customSpecs = { 
    'queue': { 
    'specs': { 
     'save_user_to_firebase': { 
     'in_progress_state': 'save_user_to_firebase_in_progress', 
     'finished_state': 'save_user_to_firebase_finished', 
     'retries': 3 
     }, 
     'fetch_from_third_party_API': { 
     'start_state': 'save_user_to_firebase_finished', 
     'in_progress_state': 'fetch_from_third_party_API_in_progress', 
     'finished_state': 'fetch_from_third_party_API_finished', 
     'retries': 3 
     }, 
     'save_to_google_datastore':{ 
     'start_state': 'fetch_from_third_party_API_finished', 
     'in_progress_state': 'save_to_google_datastore_finished', 
     'retries': 3 
     } 
    } 
    } 
} 

기능없이 테스트 코드를 작성했습니다. firebase-queue의 성능을 테스트하기 위해 모든 사용자에 대해 save_user_to_firebase 작업이 시작되는 시간을 기록합니다.

먼저 큐

var options = { 
    'specId': 'fetch_from_third_party_API', 
    'numWorkers': 100 
    }; 

    var fetchFromAPI = new Queue({ tasksRef: taskRef, specsRef: specsObjectRef }, options, function(data, progress, resolve, reject) { 

    var testUser = data.test_user; 
    var t0 = process.hrtime(); 
    //Add code for fetching from API 
    var t1 = process.hrtime(t0); 

    console.log("fetchFromAPI completed in %s %ds %dms", testUser, t1[0], t1[1]/1000000); 
    resolve(data); 
    }); 

셋째 큐

var options = { 
     'specId': 'save_to_google_datastore', 
     'numWorkers': 100 
    }; 


    var save_to_google_datastoreQueue = new Queue({ tasksRef: taskRef, specsRef: specsObjectRef }, options, function(data, progress, resolve, reject) { 

    var testUser = data.test_user; 

    var t0 = process.hrtime(); 

    var now = new Date(); 
    var t1 = process.hrtime(t0); 
    console.log("datastoreInsertActivitiesQueue completed %s %ds %dms",testUser, t1[0], t1[1]/1000000); 
    resolve(data); 
    }) 

var options = { 
     'specId': 'save_user_to_firebase', 
     'numWorkers': 100 
    } 


    var saveUserQueue = new Queue({ tasksRef: taskRef, specsRef: specsObjectRef }, options, function (data, progress, resolve, reject) { 

    var t0 = process.hrtime(); 
    var testUser = data.test_user; 

    var now = new Date(); 
    console.log("started %s %d:%d:%d:%d", testUser, + now.getHours(), now.getMinutes(), now.getSeconds(), now.getMilliseconds()); 

    var t1 = process.hrtime(t0); 
    console.log("save_user_to_firebase completed in %s %ds %dms", testUser, t1[0], t1[1]/1000000 ); 

    resolve(data); 
    } 

두 번째 큐는 내가 단일 업데이트 호출 (40 개) 작업을 밀었다. 각 대기열에 대해 100 명의 직원을 사용합니다. save_user_to_firebase tasks에 상당한 지연이 있음을 확인했습니다. 대기열에 기능이 없습니다. 결과는 위의 코드에 의해 생성됩니다.

모든 사용자에 대해 save_user_to_firebase 사이의 시간 차이를 큐의 첫 번째 사용자 시간과 비교하여 측정합니다.

started user1 at 13:5:13:575 
…… 
started user40 at 13:5:34:545 

로그를 구문 분석하고 각 사용자의 지연을 계산하는 스크립트를 작성했습니다. 출력은 다음과 같습니다.

user1 delay = 0:0 
user3 delay = 0:0 
user4 delay = 0:0 
user5 delay = 0:1 
user6 delay = 0:2 
user7 delay = 0:2 
user2 delay = 0:2 
user9 delay = 0:3 
user10 delay = 0:4 
user11 delay = 0:4 
user12 delay = 0:5 
user13 delay = 0:5 
user14 delay = 0:6 
user8 delay = 0:7 
user16 delay = 0:7 
user15 delay = 0:8 
user18 delay = 0:9 
user19 delay = 0:10 
user20 delay = 0:10 
user21 delay = 0:11 
user22 delay = 0:12 
user17 delay = 0:12 
user24 delay = 0:13 
user23 delay = 0:13 
user26 delay = 0:14 
user27 delay = 0:14 
user28 delay = 0:14 
user29 delay = 0:15 
user30 delay = 0:16 
user25 delay = 0:16 
user32 delay = 0:17 
user31 delay = 0:17 
user34 delay = 0:18 
user35 delay = 0:18 
user36 delay = 0:18 
user37 delay = 0:19 
user38 delay = 0:20 
user33 delay = 0:21 
user40 delay = 0:20 
user39 delay = 0:21 

정상적인 성능 속도입니까?

답변

0

Firebase 큐 라이브러리는 Firebase 데이터베이스 트랜잭션을 사용하여 하나의 작업자 프로세스 만 작업을 확보 할 수 있도록합니다. 즉, 최대 처리량은 작업 크기의 큰 부분에 따라 달라집니다. 작업자가 많을수록 작업이 짧을수록 대기열에서 경쟁률이 높아집니다. 짧은 작업의 경우 수십 명의 근로자를 사용하지 않는 것이 좋습니다. 그런 다음 처리량 증가 수준을 확인하고 잠재적으로 감소시킬 수 있습니다.