【问题标题】:Best way to handle webhook response timeouts in Flask?在 Flask 中处理 webhook 响应超时的最佳方法?
【发布时间】:2020-11-24 00:39:21
【问题描述】:

我有一个在 Google Cloud Function 上运行的 Flask 应用程序,该应用程序在创建订单时从 Shopify 接收 Webhook。问题是我经常超时,这就是我的意思:

@app.route('/', methods=['POST'])
def connectToSheets(request):
    print('Webhook received...')

    # Verify request is coming from Shopify
    data = request.data
    hmac_header = request.headers.get('X-Shopify-Hmac-SHA256')
    verify_webhook(data, hmac_header)
    print('Request validated...')

    # Do some stuff...

Shopify 的 docs 声明订阅有 5 秒的超时期限和重试期限。在我验证请求后,有很多代码,所以我几乎每次都超时。

在我验证 Webhook 并开始处理 Webhook 之前,我是否可以向 Shopify 发送 200 状态代码?或者有解决办法吗?

【问题讨论】:

  • 可能写一个background function 来处理繁重的处理?我对 Google Cloud 不太熟悉,但是从这个文档的声音中,您可以让 Cloud Storage 事件触发后台功能。可能有可能让您问题中的脚本写入 Cloud Storage,立即返回 200,然后该对象的创建触发后台功能。
  • 参见dev.to/googlecloud/… 的示例(这使用了 Slack 的 webhook,但行为应该类似)
  • @DustinIngram 这正是我想要的谢谢!
  • 很高兴听到这个消息!如果您想接受,我将其添加为带有更多详细信息的答案。

标签: python flask google-cloud-platform google-cloud-functions shopify


【解决方案1】:

完全使用 Cloud Functions 执行此操作的一种方法是设置两个函数:

  • 处理初始请求的请求
  • 第二个进行处理,然后跟进响应

除了处理初始请求外,第一个函数还通过 Cloud Pub/Sub 调用第二个函数。

完整示例参见https://dev.to/googlecloud/getting-around-api-timeouts-with-cloud-functions-and-cloud-pub-sub-47o3(这使用了 Slack 的 webhook,但行为应该类似)。

【讨论】:

    【解决方案2】:

    我曾经遇到过和你一样的问题。因此,我们使用 celery 和 rabbitMq 将处理代码从内联执行转移到后台任务中执行。 RabbitMq 用于队列管理。您也可以使用 Redis 进行队列管理。

    芹菜 - https://docs.celeryproject.org/en/stable/getting-started/index.html

    RabbitMq - https://www.rabbitmq.com/documentation.html

    使用 Flask、Redis 和 Celery 的异步任务 - https://stackabuse.com/asynchronous-tasks-using-flask-redis-and-celery/

    如何使用 Celery 和 RabbitMQ 设置任务队列 - https://www.linode.com/docs/development/python/task-queue-celery-rabbitmq/

    【讨论】:

      猜你喜欢
      • 2011-05-21
      • 1970-01-01
      • 2019-05-03
      • 2021-07-05
      • 1970-01-01
      • 1970-01-01
      • 2015-05-30
      • 2019-10-25
      • 2015-03-05
      相关资源
      最近更新 更多