여러개의 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);
'IT-Consultant' 카테고리의 다른 글
검색서버를 모니티링할 수 있는 프로그램을 만들어 보자. (0) | 2007.06.17 |
---|---|
Timeout, Timeout..... (0) | 2007.06.17 |
왜 Zone 검색이 equeal 검색보다 빠를 수 있을까? (0) | 2007.06.15 |
query와 searcher로 검색 수행 과정 (0) | 2007.06.13 |
query와 searcher로 검색 수행 과정 (0) | 2007.06.13 |