2013-08-11 2 views
2

ASP.NET MVC 4 인터넷 응용 프로그램 프로젝트를 만들었습니다. 이 프로젝트는 SimpleMembership을 사용합니다. 계정을 등록하기 위해 9 개의 쿼리를 실행합니다. 이것이 프로젝트와 함께 제공되는 표준 코드이기 때문에 정상적인 것처럼 보이지만 계정을 등록하는 데는 9 개의 쿼리가 많이 필요하지 않습니까?SimpleMembership 쿼리 성능

는 또한 눈치 내가 사용하는 경우 :

if (Roles.IsUserInRole("...")) 

는 4 개 쿼리 ...

이 정상이며,이 성능 문제가 될 수를 실행?

답변

1

정상입니다. 그러나 사이트가 성장할 때 성능 문제가 될 수 있습니다.

사용 권한은 사용자의 평생 동안 전혀 변경되지 않습니다. 대다수의 사용자는 기본 권한 집합을 갖게되며 (상대적으로) 적은 수만 "관리자"또는 "중재자"등의 역할을 갖습니다. 사이트가 커지면 특히 동일한 데이터를 반복해서 쿼리 할 때 사용 권한에 대해 데이터베이스를 쿼리하는 데 비용이 많이 듭니다. 페이지를 렌더링 할 때마다 일부 권한을 확인하는 것이 좋습니다. 사용자가 "삭제"버튼을 볼 권한이 있습니까? 관리자 메뉴를 볼 수 있습니까? 포럼이나 블로그 게시물 인 경우 포스터의 IP 주소를 볼 수 있습니까? 이런 종류의 일은 각 페이지 렌더링에서 권한을 여러 번 확인해야하며 실제로 DB 쿼리를 통해이를 수행하고 싶지는 않습니다.

적절한 해결책은 사용 권한을 캐시하는 것입니다. 다음을 고려하십시오 :
사용자가 로그인하면 사용자가 가지고있는 모든 권한을 쿼리하고 웹 서버의 메모리에 캐시합니다. 웹 서버가 여러 개인 경우 캐시를 동기화하거나 특정 서버에 해당 사용자의 메모리가 없다면 각 개별 서버에서 사용자 권한을 쿼리해야합니다. 이는 사용자가 해당 서버에 요청할 때 필요에 따라 발생합니다.
이제 DB를 전혀 쿼리 할 필요가 없습니다. 모든 권한 검사는 메모리에서 이루어 지므로 훨씬 빠르게 작동하고 DB 만 남겨 둡니다. 사용자의 권한을 변경하면 당연히 모든 웹 서버 캐시를 동기화해야하지만, 거의 발생하지 않는 것이 성능에 영향을 미치지 않기 때문입니다.

캐시를 지우려면 어느 정도 시간이 걸릴 것입니다. 서버의 RAM 용량 한계가 있습니다. 이 단계에서 잠시 전에 마지막으로 활동 중이며 더 이상 사용자 사이트를 탐색하지 않은 사용자의 캐시 된 권한을 삭제할 수 있습니다. 여전히 존재하더라도 다음 사용 권한에서 사용 권한이 다시로드됩니다.

+0

또는 [ASP 보안 키트] (http://ASPSecurityKit.net)와 같이 성능이 뛰어나지 만 권한이 매우 제한된 시스템에서 자유롭게 사용할 수 있습니다. –

+0

@VarunK 절대 들어 본 적이 없으며 블로그 나 기사를 찾을 수도 없습니다. 나는 정말로 시험에 들지 않은 새로운 도서관이라고 생각하니? – Artless

0

네, 모두 정상입니다. 사실, 사용자 등록은 성능에 대한 우려가 될 정도로 많이 발생하지 않습니다.

그러나 Roles.IsUserInRole("...") 및 기타 유사한 방법은 여러 번 호출 할 수 있으므로 성능 문제가 될 수 있습니다.

많은 동시 사용자가있는 웹 사이트가있는 경우 사용자 지정 역할 확인 쿼리를 수행하는 것이 좋습니다.