사용자 도구

사이트 도구


java:apache_http_client

Apache Http Client

Connection 갯수

  • HttpClient는 하나의 IP 혹은 domain name에 대한 접속 갯수가 기본적으로 5개로 제한돼 있다.
  • 고부하 서비스의 경우 이 갯수를 늘려줘야 한다.
HttpClient httpClient = HttpClientBuilder.create().useSystemProperties()
    .setMaxConnTotal([최대 커넥션 갯수])
    .setMaxConnPerRoute([IP/domain name당 최대 커넥션 갯수])
    ....

Connection/Socket Timeout

  • HttpClient timeout
    int timeout = 5;
    RequestConfig config = RequestConfig.custom()
      .setConnectTimeout(timeout * 1000)
      .setConnectionRequestTimeout(timeout * 1000)
      .setSocketTimeout(timeout * 1000).build();
    CloseableHttpClient client = 
      HttpClientBuilder.create().setDefaultRequestConfig(config).build();
  • connectionTimeout : 서버에 소켓 연결을 맺을 때의 타임아웃
  • connectionRequestTimeout : ConnectionManager(커넥션풀)로부터 꺼내올 때의 타임아웃
  • socketTimeout : 요청/응답간의 타임아웃.

Evict Idle Connections

  • KeepAlive 설정이 있을 경우, 서버에서 KeepAlive 시간 동안 사용되지 않은 커넥션(idle connection)을 죽이는 일이 생고 이를 HttpClient가 인지하지 못해서 클라이언트측에서 오류가 발생할 수 있다.
  • 클라이언트 측에서도 Idle Connection을 주기적으로 지워주면 된다.
HttpClient httpClient = HttpClientBuilder.create().
      .evictIdleConnections(2000L, TimeUnit.MILLISECONDS)
      ....
      .build();
Please note this method has no effect if the instance of HttpClient is configuted to use a shared connection manager.
Please note this method may not be used when the instance of HttpClient is created inside an EJB container.

Request Character Encoding

일반

HttpProtocolParams.setContentCharset(httpParams, "UTF-8");

POST 요청시 URL Encoded Form

UrlEncodedFormEntity 클래스 생성자에서 문자 인코딩 지정

HttpPost post = new HttpPost("http://....");
List<NameValuePair> params = new ArrayList<>();
 
params.add(new BasicNameValuePair("paramName", "param value"));
// params...
 
post.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));

HttpAsyncClient

Stale Check

  • Keep Alive 상태시 서버와 클라이언트 모두 접속중인 커넥션을 상대방에게 알리지 않고 접속을 끊을 수 있다.
  • Stale Check에 대해 각 버전별 버그 여부 등을 확인하고 올바로 설정해야 한다.

> HTTP specification permits both the client and the server to terminate a persistent (keep-alive) connection at any time without notice to the counterpart, thus rendering the connection invalid or stale. By default HttpClient performs a check, just prior to executing a request, to determine if the active connection is stale. The cost of this operation is about 15-30 ms, depending on the JRE used. Disabling stale connection check may result in slight performance improvement, especially for small payload responses, at the risk of getting an I/O error when executing a request over a connection that has been closed at the server side.


See the http.connection.stalecheck parameter documentation for more information.

참조

java/apache_http_client.txt · 마지막으로 수정됨: 2021/07/27 10:26 저자 kwon37xi