AWS Lambda - Spring Cloud Function - Тайм-аут соединения JSoup при холодном запуске

1
8

У меня есть функция Spring Cloud в AWS Lambda, которая возвращает тайм-аут соединения при попытке парсить веб-сайт с помощью JSoup. Этот тайм-аут соединения происходит только при холодном запуске.

Эта функция запускается в prod правилом EventBridge.

Веб-сайт правильно парсится/считывается, когда функция прогревается, но через 1,5–2 часа функция становится холодной, и при следующей попытке парсить веб-сайт в prod это приводит к тайм-ауту соединения.

При прогреве функция обычно успешно завершается в течение 8–10 секунд. Функция lambda имеет тайм-аут в 1 минуту.

В настоящее время я использую AWS Lambda без VPC, так как функция не обращается ни к каким ресурсам в моей учетной записи.

Я проверил подключение к Интернету перед использованием JSoup, как вы можете видеть в моем codeе.

Кроме того, я могу протестировать функцию с помощью опции "test" консоли, и все работает нормально.

URL-адрес скрыт в журналах для ясности.

Что может быть причиной этой проблемы?

2024-08-19T18:05:56.418Z
Internet is available
2024-08-19T18:05:56.419Z
Trying to connect to https://pra.uf**/ (attempt 1)
2024-08-19T18:06:12.712Z
Failed to connect to https://pra.uf**/ on attempt 1: Connection timed out
2024-08-19T18:06:13.712Z
Trying to connect to https://pra.uf**/ (attempt 2)
2024-08-19T18:06:29.094Z
Failed to connect to https://pra.uf**/ on attempt 2: Connection timed out
2024-08-19T18:06:30.094Z
Trying to connect to https://pra.uf**/ (attempt 3)
2024-08-19T18:06:45.478Z
Failed to connect to https://pra.uf**/ on attempt 3: Connection timed out
2024-08-19T18:06:46.478Z
Trying to connect to https://pra.uf**/ (attempt 4)
2024-08-19T18:06:55.461Z 7bcf94b5-6b47-42d2-815d-46cf3dd4ff7a Task timed out after 60.08 seconds
public boolean isInternetAvailable() {
  try {
    final URL url = new URL("http://www.google.com");
    final URLConnection conn = url.openConnection();
    conn.connect();
    conn.getInputStream().close();
    return true;
  } catch (IOException e) {
    return false;
  }
}
@Component
public class ScraperRU implements IScraperRU {

    private static final int TIMEOUT_CONNECTION = 35000; // 35 seconds
    private static final int RETRY_DELAY = 1000; // 1 second
    private static final int MAX_RETRIES = 4;
    private final Utils utils;
    private final ScraperHelper scraperHelper;
    private final String ruUrl;

    public ScraperRU(Utils utils, ScraperHelper scraperHelper, @Value("${RU_URL}") String ruUrl) {
        this.scraperHelper = scraperHelper;
        this.utils = utils;
        this.ruUrl = ruUrl;
    }

    public Document connectScraper(String webURL) throws InterruptedException {
        if (!utils.isInternetAvailable()) {
            throw new RuntimeException("No internet connection available");
        }

        int attempt = 0;

        System.out.println("Internet is available");

        while (attempt < MAX_RETRIES) {
            try {
                attempt++;
                System.out.println("Trying to connect to " + webURL + " (attempt " + attempt + ")");

                Connection.Response response = Jsoup.connect(webURL).timeout(TIMEOUT_CONNECTION)
                        .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36")
                        .execute();

                System.out.println("HTTP Status Code: " + response.statusCode());
                System.out.println("HTTP Status Message: " + response.statusMessage());
                System.out.println("Response Headers: " + response.headers());

                if (response.statusCode() == 200) {
                    return response.parse();
                } else {
                    System.out.println("Unexpected HTTP status code: " + response.statusCode());
                    throw new RuntimeException("Failed to retrieve content from the website due to unexpected HTTP " + "status code: " + response.statusCode());
                }
            } catch (IOException e) {
                System.out.println("Failed to connect to " + webURL + " on attempt " + attempt + ": " + e.getMessage());

                if (attempt >= MAX_RETRIES) {
                    throw new RuntimeException("Failed to retrieve content from the website after " + MAX_RETRIES + " attempts");
                }

                Thread.sleep(RETRY_DELAY);
            }
        }

        throw new RuntimeException("Failed to retrieve content from the website after " + MAX_RETRIES + " attempts");
    }
Милица
Вопрос задан16 августа 2024 г.

1 Ответ

Ваш ответ

Загрузить файл.