Jetty 9.4.14 ProxyServlet увеличить или отключить тайм-аут - PullRequest
0 голосов
/ 15 января 2019

Я использую встроенный причал (9.4.14.v20181114) для реализации следующей настройки

JettySetup.

Как показано на рисунке, все клиенты обращаются к прокси-серверу, и в соответствии с некоторыми бизнес-правилами прокси-сервер перенаправляет на один из веб-серверов. используя метод пристани ProxyServlet#rewriteTarget. Для этого я определяю новый класс, который расширяет ProxyServlet и переопределяет rewriteTarget

Каждый сервер с картинки развернут на другом компьютере.

Некоторым запросам клиентов требуется время для обработки, и получается, что если запросу требуется более 30 секунд, прокси-сервер отвечает клиенту с помощью

HTTP/1.1 504 Gateway Timeout
Date: Tue, 15 Jan 2019 09:04:37 GMT
Connection: close
Content-Type: application/json"

Есть ли способ увеличить этот тайм-аут или полностью его удалить.

Я пробовал следующие 2 вещи, но ни одна из них не работала

  1. Установить idleTimeout для ServerConnector
Server server = new Server();
ServerConnector connector = new ServerConnector(server);
connector.setHost(ip);
connector.setPort(port);
connector.setIdleTimeout(45000);
server.setConnectors(new Connector[] { connector });
  1. Во время переопределения rewriteTarget я установил this.setTimeout(45000);
public class RoutingServlet extends ProxyServlet {
   ...
    @Override
    protected String rewriteTarget(HttpServletRequest request) {
               this.setTimeout(45000);

               // ... business logic based on request body and headers ...

               return rewrittenUrl;
        }   
   ...
}

Оба подхода не влияют на ситуацию, и через 30 секунд прокси-сервер отвечает клиенту HTTP/1.1 504 Gateway Timeout, тогда как веб-сервер, который фактически обрабатывает запрос, все еще обрабатывает его.

1 Ответ

0 голосов
/ 15 января 2019

У вас есть 2 тайм-аута для ожидания, но в конечном итоге это звучит так, как будто вы получаете сообщение об ошибке от клиента на основе прокси ( из-за ответа 504 Gateway Timeout ).

Но прежде чем мы пойдем туда, убедитесь, что в вашем ServerConnector установлен нормальный тайм-аут простоя (вероятно, он должен быть выше, чем ваш прокси-клиент). Это контролирует время простоя соединения между вашим «Клиентом» и «ProxyServer» (согласно вашей диаграмме)

Далее, если вы используете что-то вроде AsyncProxyServlet, просто установите "idleTimeout" init-параметр (, который по умолчанию равен "30000", если не указан ). Это контролирует время простоя между вашим «ProxyServer» и «Jetty Server» (согласно вашей диаграмме)

Например:

    Server server = new Server();

    HttpConfiguration http_config = new HttpConfiguration();
    http_config.setSendServerVersion(true);
    http_config.setSendDateHeader(false);

    ServerConnector http = new ServerConnector(server, new HttpConnectionFactory(http_config));
    http.setPort(8080);
    http.setIdleTimeout(45000);
    server.addConnector(http);

    ServletContextHandler context = new ServletContextHandler();
    context.setContextPath("/");

    ServletHolder proxyHolder = new ServletHolder("proxy", AsyncProxyServlet.class);
    proxyHolder.setInitParameter("idleTimeout", "44000");
    context.addServlet(proxyHolder, "/proxy");

    ServletHolder defHolder = new ServletHolder("default", DefaultServlet.class);
    context.addServlet(defHolder, "/");

    HandlerList handlers = new HandlerList();
    handlers.addHandler(context);
    handlers.addHandler(new DefaultHandler());

    server.setHandler(handlers);
    server.start();
    server.join(); // wait for server thread to finish

Кроме того, вы также можете сделать это в своем обычном AsyncProxyServlet.

package jetty.proxy;

import javax.servlet.ServletException;

import org.eclipse.jetty.client.HttpClient;
import org.eclipse.jetty.proxy.AsyncProxyServlet;

public class MyProxyServlet extends AsyncProxyServlet
{
    @Override
    protected HttpClient createHttpClient() throws ServletException {
        HttpClient client = super.createHttpClient();
        client.setIdleTimeout(44000);
        return client;
    }
}
...