如何在长 运行 程序中立即确认 Pub/Sub 消息
How to immediately acknowledge a Pub/Sub message in a long-running program
我有一个 App Engine 服务 运行ning Python 3.7(标准环境),它是 Pub/Sub 主题的推送订阅者(因此由该主题触发)。这个程序可以运行很久。我需要能够立即确认消息然后继续 运行ning,这样服务就不会连续接收相同的消息。
我在这里看到两种可能性:
- 理想情况下,我希望能够确认消息,然后让程序 运行 顺其自然;
- 或者,考虑到该服务是幂等的,我可以让该服务被消息拦截,忽略所有重复消息,然后在程序结束时确认一次。
我认为选项 1 似乎更有吸引力-但我不知道它在 Python 中是否可行。据我所知(如果我错了,请纠正我),消息在最后返回的 200
状态得到确认。
我已经将基本框架放入下面的程序中。欢迎任何想法,谢谢!
@app.route('/_ah/push-handlers/receive_messages/', methods=['POST'])
def receive_messages_handler():
if (request.args.get('token', '') != current_app.config['PUBSUB_VERIFICATION_TOKEN']):
return 'Invalid request', 400
envelope = json.loads(request.data.decode('utf-8'))
payload = base64.b64decode(envelope['message']['data'])
logging.info(f"Recieved message: {payload}")
# Long-running program in here
return 'OK', 200
推荐你去cloud task看看。它专为长时间 运行 重试策略
而设计
设计如下:
- appengine 使用 pubsub 消息,创建任务并确认消息 (return 2xx)
- 云任务为长运行进程调用appengine新端点。
我有一个 App Engine 服务 运行ning Python 3.7(标准环境),它是 Pub/Sub 主题的推送订阅者(因此由该主题触发)。这个程序可以运行很久。我需要能够立即确认消息然后继续 运行ning,这样服务就不会连续接收相同的消息。
我在这里看到两种可能性:
- 理想情况下,我希望能够确认消息,然后让程序 运行 顺其自然;
- 或者,考虑到该服务是幂等的,我可以让该服务被消息拦截,忽略所有重复消息,然后在程序结束时确认一次。
我认为选项 1 似乎更有吸引力-但我不知道它在 Python 中是否可行。据我所知(如果我错了,请纠正我),消息在最后返回的 200
状态得到确认。
我已经将基本框架放入下面的程序中。欢迎任何想法,谢谢!
@app.route('/_ah/push-handlers/receive_messages/', methods=['POST'])
def receive_messages_handler():
if (request.args.get('token', '') != current_app.config['PUBSUB_VERIFICATION_TOKEN']):
return 'Invalid request', 400
envelope = json.loads(request.data.decode('utf-8'))
payload = base64.b64decode(envelope['message']['data'])
logging.info(f"Recieved message: {payload}")
# Long-running program in here
return 'OK', 200
推荐你去cloud task看看。它专为长时间 运行 重试策略
而设计设计如下:
- appengine 使用 pubsub 消息,创建任务并确认消息 (return 2xx)
- 云任务为长运行进程调用appengine新端点。