Как добавить исправление, чтобы избежать ошибки времени ожидания шлюза 504 - PullRequest
0 голосов
/ 29 октября 2019

Я получаю 504 ошибку тайм-аута шлюза из моего вызова метода GET к другой службе. Недавно я добавил исправление, увеличив время ожидания, но это не помогло.

Это то, что я пытался

   public void getUserInformation(final Integer userId) {
        HttpClient httpClient = getBasicAuthDefaultHttpClient();
        HttpGet httpGet = new HttpGet("http://xxxx/users/"+userId);
        httpGet.addHeader("userid", userid);
        httpGet.addHeader("secret", secret);
        try {
            HttpResponse response = httpClient.execute(httpGet);
            HttpEntity entity = response.getEntity();

            if (entity != null && HttpStatus.OK.value() == 
               response.getStatusLine().getStatusCode()) {
               ObjectMapper objectMapper = new ObjectMapper();
               userInfo = objectMapper.readValue(entity.getContent(), 
               UserInfo.class);
            } else {
                logger.error("Call to the service failed: response code: 
                {}", response.getStatusLine().getStatusCode());
            }
        } catch (Exception e) {
            logger.error("Exception: "+ e);
        }

   }

  public HttpClient getBasicAuthDefaultHttpClient() {
    CredentialsProvider provider = new BasicCredentialsProvider();
    UsernamePasswordCredentials creds = new 
    UsernamePasswordCredentials(user, password);
    provider.setCredentials(AuthScope.ANY, creds);

    //Fix to avoid HTTP 504 ERROR (GATEWAY TIME OUT ERROR) for ECM calls
    RequestConfig.Builder requestBuilder = RequestConfig.custom();
    requestBuilder.setConnectTimeout(30 * 1000);
    requestBuilder.setConnectionRequestTimeout(30 * 1000);

    HttpClientBuilder builder = HttpClientBuilder.create();
    builder.setDefaultRequestConfig(requestBuilder.build());
    builder.setDefaultCredentialsProvider(provider).build();

    return builder.build();
  }

Я вызываю этот процесс в цикле для обработки записей,это работает для большинства записей, но не для нескольких userId. Но я заметил, что все будет работать нормально, когда я запускаю только сбойные записи, не уверен, в чем проблема в этом случае.

Я думал о вызове метода снова, когда получаю 504, чтобы снова вызвать его в надежде получить200 в следующий раз.

Не уверен, что это хорошая идея. Любой совет будет принята с благодарностью.

1 Ответ

1 голос
/ 30 октября 2019

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

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

CLIENT -> USERS SERVICE -> SOME OTHER SERVICE

Проблема в том, чтоSOME OTHER SERVICE слишком долго обрабатывает ваш запрос. USERS SERVICE сдается в какой-то момент времени и возвращает вам этот конкретный код состояния, чтобы указать, что.

Насколько я знаю, вы мало что можете сделать, чтобы смягчить проблему. Вам необходимо связаться с владельцами USERS SERVICE и попросить их увеличить время ожидания или с владельцами SOME OTHER SERVICE и попросить их повысить производительность.

Что касается причины возникновения такой ошибкивременами. Возможно, что вы, в сочетании с другими клиентами, транзитивно перегружаете SOME OTHER SERVICE, заставляя его обрабатывать запросы все медленнее и медленнее. Или это может быть связано с тем, что в SOME OTHER SERVICE включено ограничение или ограничение скорости, чтобы предотвратить атаки типа «отказ в обслуживании». Посылая слишком много запросов к USERS SERVICE, возможно, вы используете его квоту.

Конечно, все это спекуляции, не зная вашего реального сценария.

...