如何使用 Flask 确认长时间运行任务的 PubSub 推送订阅事件?

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

我正在使用 EventArc 生成事件并使用 Cloud Run 处理它们。它使用 Cloud PubSub 作为传输层。

按照此处解释的解决方案,我的代码具有以下结构。

from flask import Flask, request

app = Flask(__name__)

@app.route('/', methods=['POST'])
def index():
    # Extract Pub/Sub message from request
    envelope = request.get_json()
    message = envelope['message']

    try:
        # Process message
        # ...
        time.sleep(200)

        # Acknowledge message with 200 OK
        return '', 200
    except Exception as e:
        # Log exception
        # ...

        # Message not acknowledged, will be retried
        return '', 500

if __name__ == '__main__':
    app.run(port=8080, debug=True)

问题是,当处理时间超过 1 分钟时,我的消息未被确认:处理任务正常并返回 200 Ok,但事件仍未被确认。

因此 Pubsub 主题一遍又一遍地发送相同的消息。

为什么我的消息没有被确认?以及如何解决?

有建议收到消息后立即确认,如何做并继续处理?

PS: 我最初遇到的问题是 PubSub 没有等待处理,因此我根据此处的建议延长了 ACK 截止日期,并将其设置为 10 分钟(我的处理时间在 1 到 3 分钟之间)。

我还根据此处的建议更改了重试前的最短时间,并将其设置为 9 分钟 50 秒。

flask google-cloud-platform google-cloud-pubsub google-cloud-run
1个回答
0
投票

Eventarc 目前没有内置解决方案。您唯一的解决方案就是确认服务!

让我解释一下。创建 Eventarc 时,将创建 PubSub 主题和 PubSub 推送订阅。这里的想法是“手动”更新 PubSub 推送订阅配置,将 ack 截止时间设置为 10 分钟。


“手动”这个词不正确。我在我的一个项目中使用 terraform + post bash 脚本(基于 terraform 输出并感谢 gcloud 命令来更新由 Eventarc 创建的订阅)将其自动化。事实上,它始终是一个自制的黑客。

© www.soinside.com 2019 - 2024. All rights reserved.