如何在长时间运行的程序中立即确认发布/订阅消息

时间:2019-08-10 05:44:14

标签: python google-app-engine google-cloud-pubsub

我有一个运行Python 3.7(标准环境)的App Engine服务,该服务是发布/订阅主题的推送订阅者(并因此而触发)。该程序可以运行很长时间。我需要能够立即确认该消息,然后继续运行,以使该服务不会持续收到相同的消息。

我在这里看到两种可能性:

  1. 理想情况下,我希望能够确认该消息,然后让程序正常运行;
  2. 或者,鉴于该服务是幂等的,我可以让该服务与消息配合使用,忽略所有重复消息,然后在程序结束时进行一次确认。

我认为选项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

1 个答案:

答案 0 :(得分:1)

我建议您看看cloud task。专为长期使用重试策略而设计

设计如下:

  • appengine使用pubsub消息,创建任务并确认消息(返回2xx)
  • 云任务调用appengine新端点以实现长期运行。