如何使用Google Cloud PubSub和Run来处理资源密集型的长时间运行任务? [英] How to use Google Cloud PubSub and Run to handle resource-intensive long-running tasks?

本文介绍了如何使用Google Cloud PubSub和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运行资源?或者有没有我不知道的更好的解决方案?

因为这些过程非常耗费代码/资源,我觉得云函数是不够的。我看过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。但这些都没有回答我的问题。 我看过谷歌云任务,这可能是什么?但是该项目的其余部分都是围绕pubSub/run/函数构建的,所以我最好坚持这样做。

此项目是用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
    # ...
那么,我如何才能或应该解决这个问题,以便按需适当地扩展资源密集型任务(因此推送PubSub订阅)。并且任务只执行一次。

答案: 简而言之,答案是什么。云运行和函数就是不适合这个问题。没有办法让他们分别完成超过9分钟或15分钟的任务。唯一的解决方案是切换到另一项Google服务,并使用Pull样式的订阅,从而失去GC运行/函数的自动伸缩

推荐答案

云函数和云运行都不足以满足任意长时间运行的操作。云函数有hard cap of 9 minutes per invocation,云运行caps at 60。如果您需要更多时间,您将不得不将工作委托给另一个产品,如Google Compute Engine。应该可以从其中一个无服务器产品启动一些计算引擎工作。

考虑到pubsuback的限制,您可能必须找到一种方法,让客户端能够轮询或监听某些资源,以找出工作实际完成的时间。您可以使用数据库来实现这一点,Cloud FiRestore允许您监听文档以找出它们何时发生更改。因此,您可以使用它来跟踪长期运行的工作的状态。

这篇关于如何使用Google Cloud PubSub和Run来处理资源密集型的长时间运行任务?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆