我目前有一个云函数正在执行一些异步代码。它向端点发出Get请求以检索一些数据,然后将这些数据存储到云存储中。我已经设置了通过HTTP使用Cloud Scheduler触发的Cloud功能。当我使用Cloud Function的测试选项时,一切都很好,但当我设置Cloud Scheduler来调用Cloud Function时,它会被调用不止一次。我可以通过查看日志来判断,它显示了我现有的多个execution id's
和print语句。有人知道为什么Cloud Scheduler调用不止一次吗?我已将Max Retry Attempts
设置为0。在我的代码中有一部分,我使用asyncio's
create_task
和sleep
来确保任务被放入事件循环中以降低请求数量,我想知道这是否会导致Cloud Scheduler做一些意外的事情?
async with aiohttp.ClientSession(headers=headers) as session:
tasks = []
for i in range(1, total_pages + 1):
tasks.append(asyncio.create_task(self.get_tasks(session=session,page=i)))
await asyncio.sleep(delay_per_request)
对于我的特定情况,当本机测试(使用云函数内置的测试选项(时,我的云函数按预期执行。然而,当我设置Cloud Scheduler以通过HTTP触发Cloud Function时,它意外地运行了不止一次。正如@EdoAkse在这里的原始线程中提到的,我与Cloud Scheduler的活动不止一次运行。我的解决方案是设置云函数订阅的Pub/Sub主题,该主题将触发该云函数。然后,Cloud Scheduler将调用该Pub/Sub触发器。这基本上就是谷歌在文档中描述它的方式。
- 云计划程序->发布/子触发器->Cloud函数
观察到云调度程序两次调用云函数的行为。显然,尽管它们被定位/指定为eu-west1,但对于位于us-central1中的每个计划功能,时间表中都存在一个重复条目。删除us-central1中的重复调用解决了我的问题。