일부 서버 측 작업을 처리하기 위해 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
정상적인 성능 속도입니까?