원하시는 기능이 바로 "Session Clustering" 입니다.
Servlet 이나 JSP 스펙에는 Session Clustering 에 대한 언급은 없는 것으로 알고
있습니다. 그러나 "세션 클러스터링"은 "어플리케이션 서버(Application Server)"라고
명명되는 IBM WebSphere, BEA WebLogic, Inprise Server, PowerTier(?) 등등의 제품은
당연히 제공해야만 하는 중요한 기능 중의 하나입니다.
하나의 H/W박스에서 운영되기에는 서비스하여야할 동시단말사용자수가 상대적으로
많아져서, 여러대의 서버로 운영해야 할 필요성이 생길 수 있습니다.
즉, 하나 이상의 머신을 클러스터링하여, 동일한 "서비스"를 각 머신에게 분담시켜
Load-Balancing을 시켜야만 하는 것이지요...
여기서 질문하신 분도 지적한 바와 같이 당연히 떠오르는 문제가 바로 "세션클러스터링"
입니다. 여러 머신으로 운영할 때, 한 머신에 접속했다가 다른 머신으로 부하분산
메카니즘에 의해 다른머신으로 Request가 이동되면, 기존 머신에서 저장시켜둔
각종 "세션정보", 예를 들어, UserID, 자신이 선택한 Shopping Items 등이 그대로
머신과 머신사이에서 유지되어야 한다는 것이지요...
IBM WebSphere Application, BEA WebLogic, SilverStream Application 등등은
각기 고유한 방식으로 이러한 세션 클러스트링 기능을 제공합니다.
(세션클러스트링은 스펙이 존재하는 것이 아니기에 Vendor 고유한 방식으로
Implementation 됩니다.)
IBM WebSphere Application Server의 경우, Version 2.0.x 역시 세션클러스트링을
제공하며, Version 3.0.x에선 DB를 이용하여 "Persistent Session" 기능을 제공합니다.
보통 Memory상에서 세션정보를 갖게 하는 것이 일반적이지만, file을 이용하기도하고,
DB를 이용하기도 합니다. 이렇게 함으로써, 엔진이 비정상적으로 종료하거나,
심지어 머신이 다운되더라도 재 부팅 후 기존의 세션정보를 유지할 수 있는 것이지요.
지금 사용하지는 서블렛엔진이 무엇인지요?
Apache+Jrun, Apache+JServ, Apache+Tomcat3/4, tomcat4/4, Oracle OSDK ?
이와 같은 "서블렛엔진"이라 불리는 제품은 세션클러스트링 기능을 제공하지 않습니다.
결국, 세션클러스트링 기능을 개발자가 직접 코딩하셔야 할 겁니다.
문제는 운영하는 서블렛의 형태와 비즈니스로직이 어떠냐에 따라 구현역시
상이할 수 밖에 없고 초보적일 수 밖에 없겠네요....
가장 단순한 방법은 Cookie를 이용하시고, 실질적인 정보는 DB에 저장하시어
두 머신이 공유하는 방법일 거라 생각 됩니다.
예를 들어 한 머신에서 Login을 하면 그 정보가 DB에 기록되고, Cookie에
특별한 자신만의 고유한 session_id를 발생시킨 후, 다른 머신으로 변환될 경우
DB에서 session_id에 해당하는 정보를 DB에서 Query해서 "아하, 이 Client는
이미 로그인 했었군"이라 판단할 수 있겠지요....
(단, Cookie는 모든 머신으로 날아갈 수 있게 도메인이 셋팅되어야 할 것이고,
session_id는 서블렛엔진의 기본적인 세션이 아니라, 비즈니스적으로 만들어진
임의의 것이어야 합니다.)
그러나, 이것은 user_id에 대해서만 공유될 수 있을 뿐, Servlet의 Session 에
저장된 여하한의 java Object에 대해서는 적용받을 수 없겠지요....
기능상의 제한이 있게 마련입니다.
PS: "어플리케이션서버"라고 불리는 제품들이 비싼 값을 한다는 것이 바로 이런 부분
인 듯 합니다.
비단 세션 클러스트링 뿐만 아니라, Connection Pooling, Application Cloning,
Administration Console & Dynamic Configuration, Legacy Access API,
Transaction Support, Logging, 등등 많은 추가적인 기능이 있겠지요....
PS: J2EE스펙에서는 동일한 WAR(Web ARchive)내에서만 HTTP Session이 유지됩니다.
일부 WAS는 동일한 EAR(Enterprise ARchive)내에 존재하는 여러개의 WAR간에도
세션클러스터링을 지원합니다. (하나의 EAR에는 여러개의 WAR 및 EJB-jar가 존재할 수
있고, EAR단위로 서버(Server,인스턴스)에 deploy되는데, 서버는 인스턴스가 하나일
수도 있고, 여러대의 H/W박스에 분산되어 여러대의 Server(인스턴스) 클러스터일 수도
있습니다.)
-------------------------------------------------------
본 문서는 자유롭게 배포/복사 할 수 있으나 반드시
이 문서의 저자에 대한 언급을 삭제하시면 안됩니다
================================================
자바서비스넷 이원영
E-mail: javaservice@hanmail.net
================================================... 더보기