从 Google Cloud Run 托管应用程序触发的 Pub/Sub 消息需要很长时间

Posted

技术标签:

【中文标题】从 Google Cloud Run 托管应用程序触发的 Pub/Sub 消息需要很长时间【英文标题】:Pub/Sub message triggered from Google Cloud Run hosted application is taking a long time 【发布时间】:2021-03-08 00:45:42 【问题描述】:

我在 Google Cloud Run 中托管了一个简单的 Spring Boot 应用程序,它将 Google Pub/Sub 消息发布到同一项目中的主题。

这需要很长时间,大约需要 5 分钟。下面是我用来发布 Google Pub/Sub 消息的代码。但在 App Engine 环境中同样可以正常工作。

ApiFuture<String> messageIdFuture = com.google.cloud.pubsub.v1.Publisher.publish(pubsubMessage);
            ApiFutures.addCallback(messageIdFuture, new ApiFutureCallback<String>() 
                @Override
                public void onFailure(Throwable throwable) 
                    if (throwable instanceof ApiException) 
                        ApiException apiException = ((ApiException) throwable);
                        // details on the API exception
                        log.error("APIException Status Code: ", apiException.getStatusCode().getCode());
                        log.error("APIException is Retryable: ", apiException.isRetryable());
                    
                    log.error("Error publishing message: ", pubSubMsg);
                
                @Override
                public void onSuccess(String messageId) 
                    log.info("Success msg after publish: ", messageId);
                
            , MoreExecutors.directExecutor());

如何克服发布 Pub/Sub 消息的延迟?

【问题讨论】:

当您在 Cloud Run 中处理请求时,您想在 PubSub 中发布消息,对吗?发布它需要5分钟,对吧?你能分享更多你的代码吗?我想看看你是等待 ApiFuture 还是让它在后台运行。 这是我用于发布 pubsub 消息的完整代码。我正在使用 docker 容器化并部署到云中运行 这段代码叫什么?你应该有一个功能。我想了解这段代码调用的上下文 【参考方案1】:

如果我没记错的话,Spring Boot 会创建一个包含嵌套 JAR 的 JAR 文件。在 Cloud Run 中,这些文件会在启动期间解压缩,这可能会影响运行时间。

Google App Engine 是一项托管服务;您无法控制运行时间,而 Cloud Run 容器需要调整以优化环境。

基于此,我希望您需要优化应用在容器中的运行方式。您使用的是多阶段构建吗?您还可以尝试使用Jib plugin 将您的应用程序容器化,看看这是否会改善您的时间安排。

我对 Spring Boot 并不太熟悉,但这个 article 讨论了如何将代码容器化以获得最佳性能。这些链接有一些关于Jib Plugin 配置的有用信息,GitHub 上的jib 扩展和这个blog post。

【讨论】:

我目前正在使用 docker 文件来容器化并部署到云运行中。我也会尝试 JIB 插件。但这会导致问题吗? 从文档中提到,胖 Spring Boot JAR“不适合容器化”。 GAE 是一项托管服务,因此您无法控制运行时间,而 Cloud Run 容器需要调整以优化环境(大小很重要)。这可能无法解决所有问题!!但请尝试这些链接以获取更多信息:Jib Plugin、GitHub、blog post 谢谢@Andrew。我会检查这些链接。

以上是关于从 Google Cloud Run 托管应用程序触发的 Pub/Sub 消息需要很长时间的主要内容,如果未能解决你的问题,请参考以下文章

监控 Google Cloud Run 内存使用情况

Google Cloud Run(完全托管):无法自定义域映射

如何在已部署的 Cloud Run Service(托管)中使用 Google Secret?

Cloud Run 完全托管连接到 Cloud SQL:这是不是支持 SQL Server?

GCP - 无法在 Cloud Run 中使用 Google Secret Manager (@google-cloud/secret-manager)

GCP 托管的 Cloud Run 的出站 IP 范围是多少?