我正在使用 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 秒。
Eventarc 目前没有内置解决方案。您唯一的解决方案就是确认服务!
让我解释一下。创建 Eventarc 时,将创建 PubSub 主题和 PubSub 推送订阅。这里的想法是“手动”更新 PubSub 推送订阅配置,将 ack 截止时间设置为 10 分钟。
“手动”这个词不正确。我在我的一个项目中使用 terraform + post bash 脚本(基于 terraform 输出并感谢 gcloud 命令来更新由 Eventarc 创建的订阅)将其自动化。事实上,它始终是一个自制的黑客。