我正在使用 Cloud Pub/Sub 触发器和 Google Cloud Scheduler 触发 Google Cloud 功能。日志会重复该函数在给定日期运行的次数。我不确定它是否达到了最大重复次数。
我已确认没有任何循环导致该问题,并尝试输出非结构化日志,但没有看到相同的重复。
import logging
from google.cloud import logging as cloudlogging
# Instantiates a client
log_client = cloudlogging.Client()
log_handler = log_client.get_default_handler()
cloud_logger = logging.getLogger("cloudLogger")
cloud_logger.setLevel(logging.INFO)
cloud_logger.addHandler(log_handler)
cloud_logger.error('unable to delete from qb')
我希望每次脚本运行时,脚本的每个日志输出都会有一个日志。
示例:
2020-10-01 15:25:04.562 AEST Unleashed_Quickbase_Jobs-1yk5flpwmlrll found
我实际得到的是上面的日志乘以我的脚本在一天中运行的次数,在我的计划脚本运行 3 次后,时间戳几乎相同,如下所示。
Unleashed_Quickbase_Jobs-1yk5flpwmlrll found 2020-10-01 15:25:04.564 AEST
Unleashed_Quickbase_Jobs-1yk5flpwmlrll found 2020-10-01 15:25:04.566 AEST
Unleashed_Quickbase_Jobs-1yk5flpwmlrll found 2020-10-01 15:25:04.567 AEST
我希望这能让它更清楚。
此问题可能是由以下一个或多个原因引起的:
没有明确确认:
如果不返回 HTTP
200 OK
状态,Pub/Sub 会假定消息未成功处理并重试。确保您的云函数显式返回 200 OK
以确认该消息。
确认截止日期太短:
Pub/Sub 订阅的
--ack-deadline
参数应设置为超过服务(在本例中为云函数)执行时间的持续时间。因此按如下方式更新(例如此处为 600 秒):
gcloud pubsub subscriptions update SUBSCRIPTION_NAME --ack-deadline=600
支持的最大确认截止时间为10 分钟(600 秒)。如果您的函数执行时间超过 10 分钟:
200 OK
,并像这样异步处理处理: import asyncio
async def process_message(data):
await asyncio.sleep(300) # Simulate long-running task
print(f"Processed: {data}")
def pubsub_handler(event, context):
asyncio.create_task(process_message(event["data"]))
return "Message acknowledged", 200