Сообщение Pub / Sub, запущенное из облачного приложения Google для запуска, занимает много времени

#java #spring-boot #google-cloud-pubsub #google-cloud-run

# #java #пружинный ботинок #google-cloud-pubsub #google-cloud-run

Вопрос:

У меня есть простое приложение Spring boot, размещенное в Google Cloud Run, которое публикует сообщение 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?

Комментарии:

1. Когда вы обрабатываете запрос в Cloud Run, вы хотите опубликовать сообщение в PubSub, верно? И на его публикацию уходит 5 минут, не так ли? Можете ли вы поделиться большей частью своего кода? Я хотел бы посмотреть, будете ли вы ждать ApiFuture или позволите ему работать в фоновом режиме.

2. Это полный код, который я использую для публикации сообщения pubsub. Я использую docker для контейнеризации и развертывания в облачном режиме

3. Как назвать этот код? у вас должна быть какая-то функция. Я хотел бы понять контекст вызова этого фрагмента кода

Ответ №1:

Если я правильно помню, Spring Boot создает файл JAR, содержащий вложенные банки. При облачном запуске эти файлы распаковываются во время запуска, и это может повлиять на время выполнения.

Google App Engine — это управляемая служба; вы не можете контролировать время выполнения, в то время как контейнеры Cloud Run нуждаются в настройке для оптимизации среды.

Исходя из этого, я ожидаю, что вам нужно будет оптимизировать работу вашего приложения в контейнере. Используете ли вы многоступенчатую сборку? Вы также можете попробовать использовать плагин Jib для контейнеризации вашего приложения и посмотреть, улучшит ли это ваши тайминги.

Я не слишком хорошо знаком с Spring Boot, но в этой статье обсуждается, как контейнеризировать ваш код для достижения наилучшей производительности. Эти ссылки содержат некоторую полезную информацию о конфигурации плагина Jib, расширениях jib на GitHub и этом сообщении в блоге.

Комментарии:

1. В настоящее время я использую файл docker для контейнеризации и развертывания в cloud run. Я также попробую плагин JIB. Но вызывает ли это проблему?

2. В документации упоминается, что загрузочный контейнер fat Spring «непригоден для контейнеризации».. GAE — это управляемая служба, поэтому вы не можете контролировать время выполнения, в то время как контейнеры Cloud Run необходимо настроить для оптимизации среды (размер важен). Это может решить не все!! но попробуйте эти ссылки для получения дополнительной информации: плагин Jib , GitHub , сообщение в блоге

3. Спасибо @Andrew. Я проверю эти ссылки.