如何添加修补程序以避免504网关超时错误

时间:2019-10-29 20:56:59

标签: java http-status-code-504

我从GET方法调用到另一个服务时收到504网关超时错误。 最近,我通过增加超时时间来添加修复程序,但这没有帮助。

这是我尝试过的

   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。

不确定这是个好主意。任何建议将不胜感激。

2 个答案:

答案 0 :(得分:1)

根据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的请求过多,您可能正在消耗其拥有的配额。

当然,所有这些都是猜测,而并不知道您的实际情况。

答案 1 :(得分:0)

有时候我也面临同样的问题,以下是我为解决此问题所做的检查。我将在上述类比中添加更多细节。

客户端->用户服务->其他服务

客户检查:

“其他服务”检查: 如果设置了节流/速率限制以避免DOS攻击。然后,您需要增加“其他服务”的超时时间。我在AWS上使用过tomcat服务器:更改了yaml文件中的空闲超时

metadata:
    annotations:
        #below for openshift which worked for me        
        haproxy.router.openshift.io/timeout:20000
        #below for kubernetes timeout in ELB
        service.beta.kubernetes.io/aws-load-balancer-connection-idle-timeout:20000 

还更改了tomcat上的连接器超时

 <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>

Voila!它对我有用。