谷歌云日志中的日志条目重复了函数执行的次数

问题描述 投票:0回答:1

我正在使用 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 

我希望这能让它更清楚。

python google-cloud-functions google-cloud-scheduler
1个回答
0
投票

此问题可能是由以下一个或多个原因引起的:

  1. 没有明确确认
    如果不返回 HTTP

    200 OK
    状态,Pub/Sub 会假定消息未成功处理并重试。确保您的云函数显式返回
    200 OK
    以确认该消息。

  2. 确认截止日期太短
    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
  • 或者,使用云任务来管理长时间运行的任务。
© www.soinside.com 2019 - 2024. All rights reserved.