0

我的代码在 nodejs6 中成功运行。我只是想在nodejs8中部署它。

index.js 包含以下代码

// [START functions bgMCMA]
/**
 * Background Cloud Function - Triggered by PubSub.
 * @param {!Object} event The Cloud Functions event.
 * @param {!Function} The callback function.
 */
exports.bgScrapeMCMA = (event, callback) => {

    //Logic to avoid infinite loop on timeout
    const eventAge = Date.now() - Date.parse(event.timestamp);
    const eventMaxAge = 420000; //7Minutes as timeout is set as 504 seconds(9Minutes)

    // Ignore events that are too old
    if (eventAge > eventMaxAge) {
      console.log(`INFINITE-LOOP-BREAK : Dropping context ${context} with age ${eventAge} ms.`);
      callback(); // Don't forget to call the callback. Remember its either a callback() or promise
      return;
    }    

    // The Cloud Pub/Sub Message object.
    const pubSubMessage = event.data;
    const message = pubSubMessage.data ? Buffer.from(pubSubMessage.data, 'base64').toString() : 'NONE';

    console.log('MCMA triggered time : ' + DateTime.getCurrentISTdt("yyyy-mmm-dd hh:mm:ss") + ' Message : ' + message);

    MCMA.start().then( (resp) =>{
        console.log('MCMA : Success : '+resp);
        callback(); // Don't forget to call the callback. Remember its either a callback() or promise        
    }).catch( (e) =>{
        console.error('MCMA : Error : '+e);
        callback(); // Don't forget to call the callback. Remember its either a callback() or promise
    });

};
// [END functions bgMCMA]

使用以下命令部署到 nodejs8

gcloud functions deploy bgScrapeMCMA --trigger-resource psTriggerbgScrapeMCMA --trigger-event google.pubsub.topic.publish --entry-point=bgScrapeMCMA --timeout=540s --runtime nodejs8

函数已成功部署。

我正在通过 pubsub 触发代码。从功能控制台,我将单击主题并在消息文本区域中发布类似“TEST”的消息。

期望是什么?
在检查日志时,它通常会显示消息“TEST”。所以,我可以理解功能已成功触发。

在 nodejs8 中部署后我看到了什么?

  1. 在我在 pubsub 中输入消息“TEST”后。在日志中,我看到的消息是“NONE”。所以我的理解是功能被触发了它没有收到我的信息。

  2. 函数执行大约 45 秒后。它崩溃并显示消息 textPayload:“错误:函数崩溃超出请求范围函数调用被中断。”。

  3. 当我重新运行时,这次它因为内存 textPayload 而崩溃:“错误:超出内存限制。函数调用被中断。”

由于第二次因为内存崩溃,目前使用的是256MB。所以我编辑了函数并将其增加到 512MB。第一个错误再次出现,“错误:函数崩溃超出请求范围函数调用被中断。”。

在这一点上,我怀疑我以前工作的程序,只是为了升级到 nodejs8。我删除了以前的工作功能并尝试使用新的节点版本进行部署。所以我回去重新部署 nodejs6 和 256MB 内存。当我执行它的功能时。

该功能的基本作用是抓取网站并更新 Firebase。经过的功能大约是 10s - 45s。

所以我基本上想知道两件事,GCP 中的 NodeJS8 发生了什么变化。
1. 来自 pubsub 的简单消息没有出现在日志中

const pubSubMessage = event.data;
const message = pubSubMessage.data ? Buffer.from(pubSubMessage.data, 'base64').toString() : 'NONE';

console.log('MCMA triggered time : ' + DateTime.getCurrentISTdt("yyyy-mmm-dd hh:mm:ss") + ' Message : ' + message);
  1. 消耗大量内存。256MB 的工作 nodejs6 甚至在 512MB 时都崩溃了。

我知道 nodejs8 处于测试阶段。最终它将来到GA。如何解决这个问题。

4

1 回答 1

1

下面的评论显示了这个问题是如何解决的。

于 2019-02-17T01:00:55.060 回答