본문 바로가기

IT-Consultant

Timeout, Timeout.....

여러개의 Timeout이 있다. 검색에서 사용하는 timeout이 있고 TCP/IP 통신에서 사용하는 timeout이 있다.
또한 셋팅할때 Client에서 셋팅할 수도 있고 서버에서도 할 수 있다. 그리고 버전별로 timeout의 형태가 다르다.
그래서 이 timeout에 대해서 정리가 필요하다.
어떤 기준으로 정리를 할까? 기준의 상세내역부터 정리하자.
1. 버전 : K2 220, K2 550
2. 연결형태 : 검색, TCP/IP
3. 설정하는 곳 : API, K2Broker, K2Server

3개의 매치를 살펴보자.

테스트 환경을 적어보자.
검색 쿼리 : IMP<CONTAINS>KBS OR APNM<CONTAINS>KBS OR AGNM<CONTAINS>KBS OR 1234
데이터 건수 : 약 50만건
색인 사이즈 : 약 500MB
실제 검색 수행 속도 : 약 5초

가장 쉽게 확인할 수 있는 것이 K2 550환경에서 2번과 3번을 확인하는 것이다.
1. K2 550 환경에서 timeout을 테스트해보자.
- search timeout의 우선순위를 파악해보자.
  첫번째 시도 : k2server에 10초 API에서 1초로 할 경우 어떻게 될까? (결과 : 에러발생하지 않고 검색결과 건수가 달라진다. )
  두번째 시도 : k2server에 1초 API에 10초로 할 경우 어떻게 될까? (결과 : 정상적으로 검색된다. )
  결론 : API에서 설정하지 않았다면 K2Server에 설정한 것이 우선이고 API에서 설정한 것이 있다면 K2Server의 값은 무시된다.
- search timeout을 검출할 수 있는 방법에 대해서 알아보자.
  인증관련 Class를 사용하면 에러코드와 에러가 발생한 Collection Name을 알 수 있다.
  search timeout일 경우 1700 에러이다. 실제 아래 코드를 실행했을 경우 1700에러가 발생한다.
   AuthenticationFailures authenticationFailures = objResult.failedCollections();
   Enumeration failures = authenticationFailures.elements();
   
   while (failures.hasMoreElements())
   {
       AuthenticationFailure authenticationFailure = (AuthenticationFailure)failures.nextElement();
       System.out.println(authenticationFailure.getErrorCode() + "/" + authenticationFailure.getName());
    }
- connection timeout의 우선순위는 어떻게 될까?
  첫번째 시도 : API에서 1초로 할 경우 어떻게 될까? (결과 : socket 에러 발생)
  두번째 시도 : k2server에 1초로 할 경우 어떻게 될까? (결과 : 에러발생하지 않음 )
  API에서 timeout을 걸 경우 client단에서는 검색종료된것처럼 보이고 서버에서는 계속수행한다.
  K2Server에서 걸 경우 좀 이상하다. connection timeout이라는게 어떤 것인지 좀더 확인해봐야겠다.
  Time limit for this service to connect to aother service. 이 말로 봐서는 검색서비스와는 관련이 없고 k2admin과 통신시 사용하는 timeout으로 보인다. 따라서 이것은 나중에 확인해봐야 겠다.





참고사항
API단에서 setServerTimeout 사용해서 timeout 발생시 나는 에러
Exception in thread "main" java.lang.RuntimeException: ------
java.net.SocketTimeoutException: Read timed out
 at java.net.SocketInputStream.socketRead0(Native Method)
 at java.net.SocketInputStream.read(SocketInputStream.java:129)
 at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)
 at java.io.BufferedInputStream.read1(BufferedInputStream.java:256)
 at java.io.BufferedInputStream.read(BufferedInputStream.java:313)
 at com.verity.xmit.encrypt.DecryptedInputStream.read(Unknown Source)
 at com.verity.vxmit.encrypt.DecryptedInputStream.fill(Unknown Source)
 at com.verity.vxmit.encrypt.DecryptedInputStream.read(Unknown Source)
 at com.verity.k2.K2InputStream.readString(Unknown Source)
 at com.verity.k2.K2InputStream.readHeader(Unknown Source)
 at com.verity.k2.K2InputStream.readHeaderAndCheck(Unknown Source)
 at com.verity.k2.K2Search.<init>(Unknown Source)
 at com.verity.search.ProcessSearch.processNormal(Unknown Source)
 at com.verity.search.ProcessK2Operation.submit(Unknown Source)
 at com.verity.search.VSearch.getPSearch(Unknown Source)
 at com.verity.search.VSearch.getResult(Unknown Source)
 at SearchTimeout_K2550.main(SearchTimeout_K2550.java:27)
API단에서 timeout을 사용할때 내부적으로 어떻게 처리하는가?
if(jsConn != null)
    jsConn.setTimeOut(i);
else
    sock.setSoTimeout(i);