У меня есть функция 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");
}