Google Cloud Storage对象完成事件多次触发

时间:2018-08-22 13:32:09

标签: google-cloud-storage google-cloud-functions

场景

我有几个由Google Cloud Storage object.finalize事件触发的Google Cloud Functions。为此,我使用两个存储桶,并使用“ 同步选项:覆盖目标位置的对象”传输作业,该操作每天将单个文件从一个源存储桶复制到目标位置。这两个功能的源存储桶相同,而目标存储桶则不同。

问题

大部分时间它都按预期运行,但有时我几乎同时看到多个事件。在大多数情况下,我看到2个重复项,但一次是3个。我输入了日志事件有效负载,但始终相同。

更多详细信息

Here is an example of multiple log entries

问题

这可能是Google Cloud Storage的已知问题吗?

如果没有,则很可能是我的代码有问题。

我正在使用以下项目结构:

/functions
|--/foo-code
   |--executor.js
   |--foo.sql
|--/bar-code
   |--executor.js
   |--bar.sql
|--/shared-code
   |--utils.js
|--index.js
|--package.json

index.js

let foo;
let bar;

exports.foo = (event, callback) => {
    console.log(`event ${JSON.stringify(event)}`);
    foo = foo || require(`./foo-code/executor`);
    foo.execute(event, callback);
};

exports.bar = (event, callback) => {
    console.log(`event ${JSON.stringify(event)}`);
    bar = bar || require(`./bar-code/executor`);
    bar.execute(event, callback);
};

./ foo-code / executor.js

const utils = require('../shared-code/utils.js)

exports.execute = (event, callback) => {
       // run Big Query foo.sql statement
};

./ bar-code / executor.js

const utils = require('../shared-code/utils.js)

exports.execute = (event, callback) => {
       // run Big Query bar.sql statement
};

最后部署

foo 具有特定存储桶触发器的后台功能:

gcloud beta functions deploy foo \
                --source=https://<path_to_repo>/functions \
                --trigger-bucket=foo-destination-bucket \
                --timeout=540 \
                --memory=128MB
具有特定存储桶触发器的

bar 后台功能:

gcloud beta functions deploy bar \
                --source=https://<path_to_repo>/functions \
                --trigger-bucket=bar-destination-bucket \
                --timeout=540 \
                --memory=128MB

在我看来,最可能的问题是由于部署了多个事实(只有 trigger-bucket 标志不同)。但是奇怪的是,以上设置在大多数情况下都有效。

1 个答案:

答案 0 :(得分:1)

Cloud Function的正常行为是至少一旦事件被传递并调用后台函数,这意味着很少会出现虚假重复。

要确保函数在重试的执行尝试中正确运行,应通过实现它使其成为幂等,这样即使事件多次传递,事件也可以产生所需的结果(和副作用)。

查看文档中的guidelines for making a background function idempotent