[IIS] 웹 응용프로그램은 영원하지 않다.
제목이 반쯤 농담입니다 ㅎㅎㅎ
웹 응용프로그램을 영원하지 않다.
전에 'Asp.net'으로 데몬을 구현하는 것을 다룬 적이 있습니다.
( 참고 : [Asp.Net] IIS에 데몬(Daemon)을 올려보자 )
이렇게 데몬을 구현하면 어느 순간 데몬이 죽는 현상을 목격할 수 있습니다.
이것저것 디버깅을 해봐도 원인을 알 수 없어서 찾아보니.....
웹서버가 일정시간 이상 동작중인 쓰레드는 강제로 죽입니다
클라이언트에는 타임아웃 오류를 전달하죠
5-24시간 동작하다 죽엇다는것은 웹서버의 리사이클동작 때문입니다
둘다 설정에 있습니다
참고 자료 하나 알려드립니다.
http://weblogs.asp.net/owscott/why-is-the-iis-default-app-pool-recycle-set-to-1740-minutes
(참고 : 데브피아 : 쓰래드가 자기 혼자 소멸하는 현상 막는 방법이 있나요?)
.....아?
웹서버의 응용프로그램은 사용자가 없으면 일정 시간 대기를 하다가 죽는다는 겁니다.
웹서버의 생명주기 확인
그럼 'Global.asax'의 'Application_Start'와 'Application_End'에 로그를 남기는 코드를 넣고 웹서버를 돌려 봅시다.
클래스가 웹서버가 죽는 시점과 비슷한 시점에 죽는다는 걸 알 수 있습니다.
(가비지 컬랙터가 실행될 때 죽기 때문에 시점 차이가 클 수 있습니다.)
어찌 되었건 웹응용프로그램이 일정 시간 사용되지 않아 죽는다는 것이 확인되었습니다.
웹응용프로그램이 죽으니 거기에 소속된 객체들도 죽는거죠.
이 상황에서 데몬을 정상적으로 이용하기는 힘들어 보이고 좀 편법을 써야겠네요.
편법이 가능하다는 시점에서 제목이 반만 농담이 되는 겁니다 ㅎㅎㅎ
마무리
편법은 몇 가지 방법이 있는데
1) 응용프로그램 풀에서 리사이클 시간을 늘리는 방법과(비권장)
2) 데몬이 죽기 직전에 상태를 저장해두었다가 웹서버가 올라가는 시점에(사용자가 접속하는 시점) 데몬을 살리기 전에 저장한 상태를 불러서 사용하는 방법
3) 외부에서 주기적으로 웹페이지를 호출하여 사용자가 항상 있는 것 처럼 만드는 방법
등이 있습니다.
애초에 웹서버에서 데몬을 돌리는 상황 자체가 정상적인 상황이라고 볼 수 없으므로 이런 편법은 그러려니 해야죠 ㅎㅎㅎ