RabbitMQ client 에서 useNio 사용시 timeout 이 먹히지 않는현상…

개인적으로 개발하고 있는 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 가 있는지는 아직 찾지 못했다.

나만 몰랐던 이슈로

일단 정리한대까지 까먹기 전에 기록으로 남겨 둔다. (나의 스승님들이 답을 주실듯)

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다