최근에 프로젝트를 진행할 때, 일부 페이지가 많은 데이터를 불러와야 할 때가 있었고, 가끔은 페이지가 로딩이 끝나기를 기다리지 않고 페이지를 클릭한 뒤 다시 다른 페이지를 클릭하기도 했습니다
웹페이지를 로딩하는 동안 매우 느린 정지 상태가 있을 것이니, 오늘은 이를 신중히 살펴보겠습니다.
처음에는 이런 상황이 여러 웹사이트나 컴퓨터 네트워크 속도 문제에서 일어날 줄 알았는데, 이 사이트에는 이런 문제가 없었습니다. 가끔 게시할 때 멈추기도 했지만, 탭 내 다른 페이지를 클릭해 빠르게 로드할 수 있었습니다.
오늘은 좀 더 자세히 살펴보겠습니다!! 먼저 테스트된 코드:
홈뷰 코드:
컨트롤러 코드:
테스트 코드 분석을 위해 컨트롤러는 3가지 메서드가 있는데, 하나는 홈 페이지이고 나머지 2개는 테스트 메서드입니다
Test1 요청은 5초간 차단한 후 사용자에게 데이터를 반환합니다
Test2 요청은 차단되지 않고 데이터를 사용자에게 직접 반환합니다
저희 홈페이지는 Ajax 요청을 위한 두 개의 인터페이스로 구성되어 있는데, 이는 비동기 요청이기 때문에 차단 문제가 없습니다.
Test1 메서드는 Test2가 콘텐츠를 출력한 후에만 콘텐츠를 출력한다는 것을 알게 될 것입니다 (보통 페이지는 Test2가 반환한 내용을 직접 출력한 후, js가 차단하지 않기 때문에 Test1이 반환한 콘텐츠를 출력하기 위해 5초간 기다립니다)
그 다음, Test1과 Test2 인터페이스에 직접 접근하는데, 먼저 Test1에 접근한 후 바로 Test2에 접근하면, Test2는 Test1이 돌아올 때까지 기다려야 한다는 것을 알 수 있습니다. 아래 그림에서 볼 수 있습니다:
페이지 요청이 리더 락을 설정하면, 같은 세션에서 동시에 처리되는 다른 요청들은 세션 상태를 업데이트할 수 없지만, 적어도 읽을 수는 있습니다. 만약 어떤 페이지가 세션 상태에 대해 쓰기 잠금을 요청하면, 읽거나 쓰기를 원하든 다른 모든 페이지가 차단됩니다. 예를 들어, 두 프로그램 뷰가 같은 세션에서 동시에 콘텐츠를 작성하고 있다면, 한 프로그램은 다른 프로그램이 완료될 때까지 기다려야 작성할 수 있습니다. AJAX 프로그래밍에서는 이러한 현상을 인지하는 것이 중요합니다.
특별 참고: 세션을 작성할 때만 Asp.net 요청을 차단하지만, 세션이 작성된 페이지를 방문한 경우, 예를 들어 세션이 있는 시스템에 로그인한 후 작업(세션은 만료될 때까지 잠기며, 단지 세션 ID가 동일할 때만 해당됩니다). 이런 문제가 생길 것입니다.
네티즌 정보
웹사이트가 세션을 사용하는 한, 각 요청은 세션 수명 동안 잠기므로 동일한 세션ID를 가진 요청은 잠금 해제를 기다려야 합니다
즉, 웹사이트에 타임아웃 페이지가 있으면 아무것도 할 수 없고, 타임 페이지가 로드될 때까지 기다려야 한다는 뜻입니다.
같은 페이지에 여러 개의 ajax 요청을 동시에 보내는 것도 불가능합니다. 메시지 폴링 요청도 할 수 없습니다.
요약하자면:요청에 세션을 가져가거나 세션을 가져오지 않으면 위 상황은 발생하지 않습니다
용액:
컨트롤러 컨트롤러에 SessionState(System.Web.SessionState.SessionStateBehavior.ReadOnly) 기능을 추가했습니다.
메모:
필수란 세션에 대한 독점 잠금(즉, 동일한 세션 ID에 대한 요청을 병렬 처리하지 않음)을 의미합니다. ReadOnly는 세션에 대해 비독점적 잠금을 요청하는 것을 의미합니다(즉, 독점적 잠금이 있는 요청을 완료하려면 요청이 완료되지만, 비독점적 요청을 처리할 수 있습니다 자물쇠는 병렬로 연결되어 있습니다. 하지만 코드가 세션에 쓰이지 않도록 하는 것은 본인의 몫입니다. 이 규정이 반드시 프레임워크에 의해 강제되는 것은 아닙니다) 필수란 요청한 세션 뮤텍스를 의미합니다(즉, 동일한 세션 ID를 병렬로 처리할 필요가 없음)
ReadOnly는 요청한 세션이 비독점적 잠금(즉, 요청이 완료될 때까지 기다려야 하며, 독점 잠금을 요청하는 경우는 있지만 병렬 비독점적 잠금이 있는 요청을 처리할 수 있음)을 의미합니다. 하지만 코드가 세션을 작성하지 않도록 해야 합니다. 프레임워크에서 실행해야 하는 것은 아닙니다)
|