如何使用Google Cloud PubSub和Run处理资源密集型长时间运行的任务?

时间:2019-08-05 19:35:14

标签: google-cloud-platform google-cloud-pubsub long-running-processes google-cloud-python google-cloud-run

我有一个Google Cloud PubSub主题,该主题有时有成千上万的消息,有时有零消息进入。这些消息代表的任务每个可能需要一个小时以上。最好是我能够使用Cloud Run,因为它可以很好地扩展到需求,如果发布一千条消息,我希望增加100个Cloud Run实例。这些运行实例通过推送订阅开始。问题在于PubSub的确认超时为600秒。这意味着要让Cloud Run处理这些消息,它们必须在600秒内完成。如果没有,PubSub将其超时,然后再次发送,导致任务重新启动,直到第一个任务最终确认它为止(这会使同一任务多次运行)。 Cloud Run通过返回2 ** HTTP状态代码来确认消息。该文档指出

  

在Cloud Run上运行的应用程序完成请求处理后,将禁用或严重限制容器实例对CPU的访问。因此,您不应启动在请求处理程序范围之外运行的后台线程或例程。

那么有可能通过代码确认PubSub请求并继续进行处理,而无需让Google Cloud Run移交资源吗?还是有我不知道的更好的解决方案?

由于这些过程非常占用代码/资源,因此我觉得Cloud Functions不够用。我看过https://cloud.google.com/solutions/using-cloud-pub-sub-long-running-taskshttps://cloud.google.com/blog/products/gcp/how-google-cloud-pubsub-supports-long-running-workloads。但是这些都没有回答我的问题。 我看过Google Cloud Tasks,可能是什么?但是该项目的其余部分是围绕PubSub / Run / Functions构建的,因此最好还是坚持下去。

该项目是用Python编写的。 因此,最好是,我想这样编写我的Google Cloud Run任务:

@app.route('/', methods=['POST'])
def index():
    """Endpoint for Google Cloud PubSub messages"""
    pubsub_message = request.get_json()
    logger.info(f'Received PubSub pubsub_message {pubsub_message}')
    if message_incorrect(pubsub_message):
        return "Invalid request", 400 #use normal NACK handling
    # acknowledge message here without returning

    # ...
    # Do actual processing of the task here
    # ...

那么我该如何或应该解决这个问题,以便使资源密集型任务按需正确缩放(因此是Push PubSub subscription)。而且任务只执行一次。

答案: 简而言之,已经回答了什么。云运行和功能仅不适合此问题。无法让他们分别执行超过9或15分钟的任务。唯一的解决方案是切换到另一个Google服务并使用请求样式订阅,而失去了自动扩展GC运行/功能的功能

2 个答案:

答案 0 :(得分:3)

对于任何长时间运行的操作,Cloud Functions和Cloud Run都不足够。 Cloud Functions具有hard cap of 9 minutes per invocation,而Cloud Run具有caps at 15。如果您需要更多时间,则必须将工作委派给其他产品,例如Google Compute Engine。应该可以从其中一种无服务器产品开始Compute Engine的工作。

鉴于pubsuback的局限性,您可能必须找到一种方法,使客户端能够轮询或侦听某些资源以了解工作实际完成的时间。您可以为此使用数据库,Cloud Firestore允许您收听文档以了解它们何时更改。因此,您可以使用它来跟踪长期运行的状态。

答案 1 :(得分:2)

与托管平台相比,在GKE上运行Cloud可以处理更长的过程,更多的CPU和内存。但是,您的GKE集群始终处于运行状态,并且失去了“按使用付费”的好处。

如果要使用此解决方案,请不要直接将PubSub推送订阅链接到GKE上的Cloud Run。为此,可将Cloud Task与HTTP作业配合使用。超时时间长于PubSub(最多24小时而不是10分钟),并且重试策略是可自定义的。