Keep-alive приводит к тому, что запросы XHR навсегда останутся "ожидающими" - PullRequest
0 голосов
/ 03 апреля 2019

У меня есть эта странная проблема, для которой я не смог найти решение только с помощью Google. Насколько я понимаю, из-за того, что мой сервер использует заголовок keep-alive, все мои запросы XHR к нему со временем исчерпывают все доступные TCP-соединения с этой машины и приводят к зависанию сервера полностью. Между тем, я могу POST, проблема сохраняется только с GET-запросами.

Мы используем довольно большую систему HelpDesk на основе Java в качестве бэкэнда, и нам необходимо сохранить ее в соответствии с запросами компании. Backend - это сервер Linux, работающий под управлением Red Hat Enterprise Linux Server версии 6.4 с Apache Tomcat 7.0 и Jetty. У меня есть простая веб-страница с некоторым javascript для совершения звонков в бэкэнд на входе пользователей. Когда пользователи выбирают одну запись из списка записей, вызывается REST API нашего бэкэнда. Затем он возвращает ответ, который анализируется и представляется пользователям.
Проблема в том, что каждый раз, когда пользователь нажимает кнопку, выполняется звонок. Приблизительно после 20 щелчков или около того сервер внезапно перестает отвечать и обычно зависает. Это кросс-браузерная штука, а не только Chrome, как я и надеялся.
Я попытался устранить неполадки на стороне сервера, но безуспешно. Мне не удалось получить что-либо значимое ни от логирования на стороне сервера, ни от фонового логирования. ОЗУ более чем достаточно, пиков использования ресурсов нет. Как будто запросы внезапно перестают полностью доходить до сервера.
Я попытался добавить request.abort (); до конца, но я думаю, он тоже ничего не делает.
Мы не можем избавиться от настройки «Keep-Alive», поскольку мы не единственные, кто использует этот сервер.

Что касается кода, это простой запрос XHR.

function getInfo(authToken, CurrEntryID) {
var data = "undefined=";

var request = new XMLHttpRequest();
request.withCredentials = true;

    request.onreadystatechange = function() {
        if (this.readyState == 4 && this.status == 200) {
            TableObj = JSON.parse(request.response);
            tableObjArr.push(TableObj);

            request.abort();
        }
    };

request.open("GET", "http://XXXX:8080/j2ep/rest/api/XXXX/v1/entry/XXXX/" + CurrEntryID + "/XXXXXXXXXXXXXX", true);
request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
request.setRequestHeader("username", "XXXXXXX");
request.setRequestHeader("Authorization", authToken);
request.setRequestHeader("Cache-Control", "max-age=0");

request.send(data);

  }

Можно ли открыть соединение с конкретным ресурсом только один раз, чтобы получить данные с "другой стороны" и держать его открытым, пока пользователь не покинет страницу? Как мне это сделать?
Спасибо!

...