节点JS数据存储区读取操作花费的时间太长,无法使用Google Cloud Function返回数据

时间:2019-01-11 23:46:48

标签: google-app-engine google-cloud-platform google-cloud-datastore google-cloud-functions

我有两个云功能,第一个云功能由pubsub消息触发,第二个云功能由HTTP触发,后者将条目插入数据存储区。每隔一分钟运行一次的cron会将一条消息发布到pubsub队列,该消息将调用第一个云函数。第一个云功能的主要目的是从数据存储中获取所有条目并进行处理。问题是,读取操作要从数据存储区获取条目,因此运行查询所需的时间太长(获取约20k条目)。有时似乎云功能已在两者之间中止。

由于每秒对数据存储区的读/写限制,我正在使用分片,但即使那样,它仍然要花很多时间才能从数据存储区返回值。

这是与读取查询有关的方法-

async function fetchEntry(entityName, pageCursor) {
    let query = datastore.createQuery([entityName]).limit(2000);
    if (pageCursor) {
        query = query.start(pageCursor);
    }
    //console.log("Result jsonStr - " + JSON.stringify(results));
    const results = await datastore.runQuery(query);
    const entries = results[0];
    const info = results[1];
    if (info.moreResults !== Datastore.NO_MORE_RESULTS) {
        //console.log(`item in batch ${entityName} - ${entries.length}`);
        // If there are more results to retrieve, the end cursor is
        // automatically set on `info`. To get this value directly, access
        // the `endCursor` property.
        const results = await fetchEntry(hostName, entityName, info.endCursor);

        // Concatenate entities
        results[0] = entries.concat(results[0]);
        console.log(`${entityName} BATCH READ ${results[0].length}`);
        return results;
    }
    console.log(`${entityName} BATCH READ F - ${entries.length}`);
    return [entries, info];
}

我阅读了不同的博客,并尝试了不同的方法来克服相同的问题,这是我的观察-

  • 最初,我没有使用分页,因为我没有发现对单个读取操作中可获取的最大实体数量的任何限制,但为了验证是否添加了分页,仍然需要花费相同的时间。
  • 如果一个云功能正在进行中,并且发布了另一条消息以排队,则现有处理将中止,新的处理将接管它。 (通过堆栈驱动程序日志记录进行了检查)。我停止了cron,以便不会发生新的云函数调用,大约需要5分钟来处理4k条目。

0 个答案:

没有答案