0

firebase-queue用来处理一些服务器端的工作。当用户注册时,服务器会处理三个任务

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': '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);
  }

第二个队列

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);
  })

我通过一次更新调用推送了 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

这是正常的表现率吗?

4

1 回答 1

0

Firebase 队列库使用 Firebase 数据库事务来确保只有一个工作进程可以抓取一项任务。这意味着最大吞吐量在很大程度上取决于任务的大小。您拥有的工人越多,任务越短,队列中的争用就越高。对于短期任务,我们建议不要使用超过六名工人。之后,您将看到吞吐量增益趋于平稳,甚至可能下降。

于 2017-03-03T15:04:56.437 回答