【问题标题】:How does Google Cloud Run handle Async Calls?Google Cloud Run 如何处理异步调用?
【发布时间】:2020-12-05 21:14:22
【问题描述】:

Google Cloud Run 如何处理具有长时间运行异步代码的 Flask 应用?这种情况似乎没有很好的记录。

具体来说,我想运行类似下面的代码。会发生什么?如果没有请求进入,它会在飞行中终止吗?它会一直运行到完成然后缩放到零吗?

@app.route('/ImportVendorProducts')
def import_vendor_products():
    try:
        t = Thread(target=import_wtc_products)
        t.start()
        response = Response(response=f"Started import_wtc_products", status=202)
    except:
        response = Response(response=f"import_wtc_products failed", status=500)
    return response

【问题讨论】:

  • 您的长期工作需要多长时间?
  • 每天两次,每次 45 分钟。因此,任何类型的持久计算都不够长。

标签: google-cloud-platform google-cloud-run


【解决方案1】:

无服务器产品(Cloud Run、Cloud Functions、App Engine Standard)使用考虑 CPU、内存和请求的启发式方法来跟踪可用容量。如果没有请求,它还会将应用程序标记为空闲。后台工作会导致 CPU 被消耗(并且整个应用程序正在被使用)的情况,但可能没有请求到达实例。 “应用程序繁忙”的这种错位可能会导致对创建或终止的实例数量做出错误决策,从而导致以下行为:

  • 应用的扩展实例太多(超过并发请求保证),导致计费增加。发生这种情况是因为系统创建的实例多于 CPU 负载高,即使没有请求也是如此。
  • 应用的长时间运行的作业(后台作业)被自动缩减过早地终止。

对于短期运行的任务,您可以utilize Cloud Tasks along with Cloud Run 进行异步工作,因为它旨在在用户或服务到服务请求之外工作。

其他参考:https://cloud.google.com/run/docs/tips/general#avoiding_background_activities

【讨论】:

    【解决方案2】:

    您的容器将仅在 HTTP 请求期间分配 CPU。

    因此,在您返回并提供响应的那一刻,CPU 被占用,后台调用将不会执行。

    【讨论】:

    • Cloud Run 是否有像 Cloud Functions 上那样的最大超时? IE。我可以按计划打一个长时间的电话吗?
    • Cloud Run(完全托管)的最长超时时间为 60 分钟,通常只有最长 15 分钟的超时时间可用。将超时设置为 15 分钟以上是一项 Beta 功能。
    • Cloud Tasks 是否有助于缓解这种情况,还是我需要以某种方式调用该服务来保持活动状态?
    • 没有保活的概念。有一个请求,在得到服务之前,容器将拥有 CPU,一旦完成就不会。所以没有很多请求和 ping 保持活动的概念。
    • 这可能会转到容器的同一个实例,但不能保证。
    猜你喜欢
    • 1970-01-01
    • 2019-12-20
    • 2018-12-09
    • 2011-09-18
    • 1970-01-01
    • 1970-01-01
    • 2020-07-14
    • 2017-06-10
    • 2018-08-05
    相关资源
    最近更新 更多