我们有20个必须每天运行的函数。这些函数中的每一个都根据前一个函数的输入执行不同的操作。
我们尝试在一个函数中调用所有函数,但它遇到了超时错误,因为这20个函数的执行时间超过了9分钟。
我们如何依次触发这些多个函数,或者避免执行这些函数的一个函数出现超时错误?
没有配置或简单的方法来完成这项工作。您必须设置相当数量的代码和基础设施才能完成这项工作。
最简单的解决方案是使用pubsub类型函数将调用链接在一起。您可以向pubsub主题发送一条消息,该消息将触发下一个要运行的函数。要发送的消息的有效载荷可以是函数应该用来确定其应该如何操作的参数。如果有效负载太大,或者需要一些更复杂的数据源来做出决策,则可以使用数据库来存储下一个函数可以查询和使用的中间数据。
由于我们没有任何关于您的功能实际工作方式的具体细节,因此无法再具体说明。如果你在这个计划的特定细节上遇到问题,请再次发帖,具体描述你正在尝试做的事情,以及哪些事情没有按你预期的方式工作。
Doug解决方案有一个变体。在函数的末尾,只需编写一个特定的日志(例如"end"(,而不是将消息发布到pubsub中。
然后,转到stackdriver日志记录,搜索这个特定的日志跟踪(打开高级过滤器(,并在这个日志条目的PubSub主题中配置一个接收器。因此,每次检测到日志时,都会发布带有日志内容的PubSub消息。
最后,在这个PubSub主题上插入下一个函数。
如果需要将值从一个函数传递到另一个函数,只需在函数末尾的日志跟踪中添加这些值,并在下一个函数开始时对其进行解析。
链接功能不是一件容易的事情。事情即将发生,也许谷歌云Next会发布新产品来帮助你完成这项任务。
如果您只想让函数按顺序执行,并且不需要将一个函数的结果直接传递给下一个函数,您可以将它们封装在一个调度函数(docs(中,该函数为每个函数留出足够的运行时间。
间隔3分钟的草图:
exports.myScheduler = functions.pubsub
.schedule('every 3 minutes from 22:00 to 23:00')
.onRun(context => {
let time = // check the time
if (time === '22:00') func1of20();
else if (time === '22:03') func2of20();
// etc. through func20of20()
}
如果确实需要将每个函数的结果传递给下一个,则func1
可以将其结果存储在DB条目中,然后func2
从读取该结果开始,并以自己的结果覆盖结束,以便func3
在3分钟后启动时可以读取,等等——尽管在这种情况下,其他解决方案可能更适合您的需求。