我有一个在谷歌云功能上运行的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的文档指出,订阅有5秒的超时期和重试期。在我验证请求之后,有相当多的代码,所以我几乎每次都会超时。
在我验证Webhook之后,在我开始处理Webhook之前,有没有办法向Shopify发送200状态码?或者这有什么办法吗?
在云函数中实现这一点的一种方法是设置两个函数:
- 处理初始请求的一个
- 第二个进行处理,然后跟进响应
除了处理初始请求,第一个函数还通过Cloud Pub/Sub调用第二个函数。
请参阅https://dev.to/googlecloud/getting-around-api-timeouts-with-cloud-functions-and-cloud-pub-sub-47o3完整的示例(这使用了Slack的webhook,但行为应该类似(。
我曾经面临过和你一样的问题。因此,我们通过使用芹菜和rabbitMq将处理代码从内联执行转移到后台任务中执行。RabbitMq用于队列管理。您也可以使用Redis进行队列管理。
芹菜-https://docs.celeryproject.org/en/stable/getting-started/index.html
拉比特Mq-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/