- 실제 현업에서 장애를 분석하며 알게된 문제이다
Netty 이벤트 루프 쓰레드에서 블로킹하면, BlockingOperationException이 발생할 수 있다.
회사에서 연동 중인 사우나 락커는 업체의 DCU를 통해 컨트롤 되며, 우리 서버는 Netty를 활용하여 통신을 하고 있다.
- Netty에 대해 잘 모른다면, 간략하게 이해에 도움이 될 수 있는 사전 정보를 작성해보았으니 참고바란다.
- 업체 dcu와 회사 현장 애플리케이션 서버는 주기적으로 헬스체크를 하며, 커넥션을 유지한다.
- 그리고 첫 커넥션이 맺어질 때, addListener로 ChannelCloseEvent를 등록해둔다.
- 이는 연결에 문제가 생겨 채널이 닫히면, 항상 reconnect를 시도하는 로직이 들어가 있다.
문제가 발생한 흐름은 다음과 같다.
1. dcu의 문제가됐든 우리 현장 서버의 문제가 됐던 읽기/쓰기 중 TImeOutException 혹은 DecodException 등이 발생한다.
2. 이러한 예외가 발생하면 채널을 닫는다.
3. 채널이 닫히면 최초 연결 시에 등록해둔 ChannelCloseEvent로 인해, reconnect 로직이 수행된다.
4. 연결과정에서 sync() 를 호출해 동기적으로 연결 결과를 기다리게 되는데, 여기서 BlockingOperationException이 발생하게 된다.
