개인적으로 개발하고 있는 OpenSource Project illuminati 는 rabbitMQ 를 사용중이다.
illuminati를 프로젝트에 적용을 하면 해당 프로젝트가 bootrun 할때 같이 올라가는데
rabbitMQ 에 문제가 생겨 컨넥션을 만들지 못할 경우 장시간 멈추는 (약 1분 20초정도) 현상이
로컬 테스트에서 발견 되었다.
분명 소스에는 timeout 이 설정되어있었지만 소용이 없었다.
Connection factory 의 useNio 옵션을 사용하지 않고 useBlockingIo 옵션을 사용할 경우
정상적으로 5초후에 timeout 이 나는것을 확인 하였지만 useNio 옵션을 사용할경우 1분이 넘게
대기를 하는 현상을 다시한번 확인하고 amqp-client 소스를 까보기 시작했다.
useNio 옵션을 사용하느냐 하지 않느냐에 따라서
FrameHandler 를 생성하기 위한 Factory 는 2가지의 구현체를 사용하는데
nio : SocketChannelFrameHandlerFactory
io : SocketFrameHandlerFactory
일단 io (blockingIo) 부터 보면
socketConnect 라는 native method 를 사용하는것을 볼 수 있으며 timeout 를 파람으로 받아서 사용할 수 있는것을 볼 수 있다.
다음 nio 를 보면
Net.class 에서 connect0 이라는 native method 를 사용하는 것을 볼 수 있고 이놈은 timeout 를 파람으로 받지를 않는것을 볼 수 있다.
헐…. 뭐지… 하고 찾아본 경과
이놈은 OS 의 tcp timeout 설정을 사용한다는것을 알 수 있었다.
sysctl 명령을 이용하여 TCP 설정들을 보면
이렇게 1분 15초가 설정된것을 볼 수 있다.
왜 timeout 을 임의로 어플리케이션 딴에서 설정을 할 수 없는지
설정할 수 있는 native method 가 있는지는 아직 찾지 못했다.
나만 몰랐던 이슈로
일단 정리한대까지 까먹기 전에 기록으로 남겨 둔다. (나의 스승님들이 답을 주실듯)