Nano Hash - криптовалюты, майнинг, программирование

Что может привести к тайм-ауту HTTP GET на localhost, когда сервер думает, что он ответил?

У меня есть приложение Java, работающее в AWS Beanstalk (Tomcat 8.5 + Apache httpd).

В какой-то момент приложение вызывает конечную точку REST на локальном хосте.

Иногда я вижу ошибку, такую ​​​​как это в журнале:

14:55:45 ... SEVERE: url[http://localhost/detail.api?id=200030599] timing=12.010 ...

Это указывает на то, что мой CustomRestTemplate перестал ждать ответа через 12 секунд.

Однако, просматривая несколько строк в журнале, я вижу запись журнала из конечной точки службы:

{
    "server_ts": "2020-08-19T14:55:33.890Z",
    "remote_ip": "127.0.0.1",
    "local_ip": "127.0.0.1",
    "method": "GET",
    "url": "/detail.api",
    "query_string": "?id=200030599",
    "protocol": "HTTP/1.1",
    "http_status": 200,
    "referer": null,
    "user_agent": "Apache-HttpClient/4.5.2 (Java/1.8.0_252)",
    "time_elapsed": 5,
    "thread_name": "http-nio-8080-exec-20",
    "host": "localhost",
}

Это мой собственный регистратор сервлетов, показывающий ответ 5 миллисекунд. Это регистрируется из внешнего фильтра сервлетов.

Эта проблема повторяется, но достаточно редко, поэтому я не могу ее воспроизвести. Так что мне нужно применить интеллектуальный подход... разработать серию гипотез и проверить каждую из них, пока не будет найдена правильная.

Каковы возможные причины?

Что я уже пробовал

Я написал собственные регистраторы, чтобы зафиксировать показанные выше тайминги. Затем я в основном натыкаюсь на кирпичную стену, поскольку тайм-аут происходит в каком-то скрытом измерении между ответом, отправляемым сервером (конечная точка локального хоста), и ответом, прочитанным клиентом.

Я вижу, что журнал Apache (из elasticbeanstack) также показывает локальный запрос:

127.0.0.1 (-) - - [19/Aug/2020:14:55:33 +0000] "GET /detail.api?id=200030599 HTTP/1.1" 200 4982 "-" "Apache-HttpClient/4.5.2 (Java/1.8.0_252)"

  • Вы пробовали GET /detail?id=#### ? Обратите внимание, что .api отсутствует в моем предложении. 21.08.2020
  • проверьте заголовок соединения... часто клиенты REST не распознают полный ответ, если не получен заголовок connection:close. Почтальон будет делать это при тестировании конечных точек... он покажет ответ тела, но соединение остается открытым, а время ответа просто продолжает тикать и может в конечном итоге достичь некоторого предела времени ожидания на вашем клиенте. 21.08.2020
  • @DynasticSponge Мне нравится ваше мышление, оно соответствует симптомам. Я добавлю ведение журнала на уровне проводов, чтобы попытаться поймать его в следующий раз, когда это произойдет. 22.08.2020

Ответы:


1

Наконец мне удалось воспроизвести проблему в локальном тесте с помощью JMeter.

Оказывается, скрытое измерение скрывается в фильтре сервлетов:

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
        throws IOException, ServletException {
    
    long started = System.currentTimeMillis(); 

    chain.doFilter(request, response);
    
    long elapsed = System.currentTimeMillis() - started;
    
    log(request, response, elapsed);

}

Вызовы log() содержат синхронную вставку в базу данных, которая замедляется и в конечном итоге дает сбой под нагрузкой. Я предполагаю, что механизм сервлета держит соединение открытым, пока этот фильтр не вернется. Сейчас расследование переходит к поиску исправления.

22.08.2020
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..