ASP.NET MVC: Wydajność kontrolerów a przechowywanie sesji

Synchronizacja i przechowywanie sesji może być bardzo niekorzystne dla wydajności aplikacji webowej. Wyobraźmy sobie, że użytkownik wywołuje kontroler kilkukrotnie w ramach tej samej sesji. ASP.NET MVC musi zadbać o to, aby sesja zawsze miała prawidłową wartość. Niestety jest to osiągane poprzez kolejkowanie zapytaniach w ramach tej samej sesji. Jeśli zatem wywołujemy dwukrotnie metodę A, nie zostanie to wykonane współbieżnie. Dobrą stroną takiego mechanizmu jest fakt, że zapis i odczyt sesji jest bezpieczny.

W wielu przypadkach jednak, aplikacje webowe są bezstanowe. Programiści generalnie unikają sesji ponieważ zawsze wpływają one niekorzystnie na skalowalność aplikacji. W takich przypadkach warto zablokować dostęp do niej poprzez atrybut, umieszczony np. nad kontrolerem:

[SessionState(SessionStateBehavior.Disabled)]
public class SampleController : Controller
{
   public ActionResult Index()
   {
       Thread.Sleep(1000);
       return new HttpStatusCodeResult(HttpStatusCode.OK);
   }
}

Możliwe wartości SessionStateBehavior to Default, ReadOnly, Required, Disabled. W powyższym przykładzie blokujemy sesje co powinno zwiększyć wydajność, gdy kilka zapytań jest wykonywanych jednocześnie w ramach tej samej sesji.

Próba dostępu do sesji, gdy jest ona zablokowana, zakończy się wyjątkiem NullReferenceException:

public ActionResult Index()
{
  Session["test"] = "test"; // Exception!
  return new HttpStatusCodeResult(HttpStatusCode.OK);
}

Warto zauważyć, że przedstawiony scenariusz jest bardzo powszechny w Ajax – wywołujemy kilka asynchronicznych zapytań, w celu załadowania różnych fragmentów strony.

W następnym poście, napiszemy prostą aplikację, prezentującą powyższe rozważania.

Leave a Reply

Your email address will not be published.