Thinking about Reliability
Thinking about Reliability외 SimpleGeek의 최근 몇 블로그를 읽으면서, 다들 비슷한 고민을 하고 있구나 하는 생각을 하게 되었다. Garbage collection이 없는 C++ 같은 언어에선 Exception을 사용하는 것이 (내 지적 능력으론) 거의 불가능했지만, Java에선 그런 문제가 없는 줄 알았었다. 그냥 try { … } catch (Exception x) { … } 하기만 하면 되는 줄 알았었다. 나중에 Exception을 Throwable로 바꿨지만, 역시 완전한 답은 되지 않는다. 위의 블로그에서 보듯이 필요한 모든 곳에finally를 넣지 않으면 어떤 곳에서 시스템이 inconsistent한 상태로 변할 지 예측할 수가 없다. 하지만 어떻게 그렇게 할 수 있겠는가. Java나 CLR을 Unix나 Windows가 호스팅하는 경우, 마지막 수단으로서 VM 프로세스를 죽이고 다시 시작시키는 방법이 있다 (혹시 Java를 서버쪽에서 사용하시는 분들은 Wrapper를 보시기 바람). 하지만 이런 방법은 최소한 수십초 이상의 서비스 중단을 초래하며 file등 persistent data가 깨질 가능성도 많다. 또 SavaJe와 같이 OS와 VM의 구분이 없는 시스템에선 사용할 수 없는 방법이기도 하다. 하지만 JSR121이 완전히 해결해 줄 것 같지도 않다. 결국 여러 단점과 오버헤드를 감수하더라도 기존 OS의 프로세스간 독립성에 의존하는 수 밖에 없을 것 같다.