Cik reizes ir nācies dzirdēt ko klientiem vai kolēģiem, ka tīmekļa sistēmas pirmais pieprasījums ir nenormāli lēns un vispār – tur kaut kas nestrādā.
Tā ir ierasta prakse, ka daudzas lietas, kas ir nepieciešamas sistēmas darbībai tiek kešotas un kešošanas operācijas tiek veiktas Global.asax tipā Application_Start metodē. Šī metode tiek izsaukta pie aplikācijas domeina inicializācijas, kas parasti notiek kopā ar pašu pirmo sistēmas pieprasījumu. Lai kāds no sistēmas klientiem nekristu par upuri pirmajam pieprasījumam, kas var ieilgt pat līdz pāris minūtēm (ir redzētas tādas aplikācijas :)), tad parasti izstrādātāji nodarbojas ar abstrakto mākslu un mēģina izdomāt dažādus paņēmienus, kādā veidā varētu sistēmas aplikācijas baseinu (angl. application pool) mākslīgi uzsildīt, nosūtot pirmo pieprasījumu uzreiz pēc sistēmas palaišanas vai pārlādes.
Šajā risinājumā problēma vēl joprojām pastām – aplikācijas baseina pārlāde var notikt arī bez cilvēka iejaukšanās (dažādi recycling politikas nosacījumi). Ja aplikācijas pool uzsildīšanas mehānisms nav pietiekoši spēcīgi attīstīts, kāds klients tik un tā kritīs par upuri pirmajam ilgajam pieprasījumam.
Šoreiz stāsts par interesantu iespēju, kas nākusi klajā kopā ar IIS 7.5 versiju (Windows 7 vai Windows 2008 R2). Šī jaunā iespēja saucās “autoStart” un dod iespēju atzīmēt aplikācijas pool par ilgdzīvotāju jeb marķēt to kā nemirstīgo ar atzīmi startMode=”AlwaysRunning” zem attiecīgā system.applicationHost/applicationPools elementa applicationHost.config failā. Fails starp citu atrodas %windir%\system32\inetsrv\config direktorijā. Daudz lietas nu jau ir iespējams konfigurēt izmantojot lietotāja interfeisu no IIS pārvaldīšanas moduļa, tomēr šīm izmaiņām būs nepieciešams modificēt .config failu ar rokām, tāpēc ieteicams izveidot rezerves kopiju pirms manipulācijas.
Tātad konfigurācija izskatās šāda konkrētajam aplikāciju pool’am:
<configuration>
<system.applicationHost>
<applicationPools>
<add name="Default .NET 4 App Pool" autoStart="true"
startMode="AlwaysRunning" managedRuntimeVersion="v4.0" />
</applicationPools>
<!—Additional content -->
Vadoties pēc IIS konfigurācijas faila shēmas, atribūtam “startMode” ir pieejamas divas vērtības”: “OnDemand”, kas nosaka, ka aplikāciju pools tiks startēts pēc nepieciešamības, un “AlwaysRunning”, ko izmantosim šajā piemērām. Šis uzstādījums regulē Windows Activation Service (WAS) darbību, kas nodrošina attiecīgā aplikācijas baseina palaišanu uzreiz pēc sistēmas (IIS) startēšanas vai pārstartēšanas. Nākamā iespēja ir šajā ielādes laikā, kad WAS neatkarīgi no tīmekļa pieprasījumiem veic aplikācijas baseina uzstartēšanu, veikt kādas nepieciešamās operācijas – piemēram, kešatmiņas ielādi no datubāzes, kas parasti ir laika ziņā apjomīgs darbs. Šī iespēja tiek piedāvāta ar piegādātāju (angl. providers) arhitektūru, kas dod iespēju veikt šādas nepieciešamās operācijas. Par cik vienā aplikācijas baseinā var plunčāties vairākas sistēmas, tad autoStartProvider kolekcija tiek definēta aplikāciju līmenī katrā no tīmekļa vietnēm.
<configuration>
<system.applicationHost>
<sites>
<site name="Default Web Site" id="1">
<application path="/WebApplication2"
applicationPool="Default .NET 4 App Pool"
serviceAutoStartEnabled="true"
serviceAutoStartProvider="PrewarmMyCache">
<virtualDirectory path="/"
physicalPath="C:\inetpub\wwwroot\WebApplication2" />
</application>
<bindings>
<binding protocol="http" bindingInformation="*:80:" />
</bindings>
</site>
<!-- Additional site definitions -->
</sites>
Tātad tiek definēta vai vispār ir nepieciešama šāda iespēja (serviceAutoStartEnabled), kā arī tiek definēts, kurš piegādātājs ir jāizsauc.
Uzstartēšanās piegādātāji tiek definēti serviceAutoStartProviders elementā. Zemāk esam nodefinējuši tikai vienu piegādātāju:
<configuration>
<system.applicationHost>
<serviceAutoStartProviders>
<add name="PrewarmMyCache" type="WebApplication2.CacheWarmupProvider, WebApplication2" />
</serviceAutoStartProviders>
Šim definētajam tipam (WebApplication2.CacheWarmupProvider) ir jāimplementē “System.Web.Hosting.IProcessHostPreloadClient” interfeiss. Definēto tipu un asembliju WAS mēģina ielādēt no tās pašas tīmekļa aplikācijas bin/ direktorijas.
using System.Threading;
namespace WebApplication2
{
public class CacheWarmupProvider : System.Web.Hosting.IProcessHostPreloadClient
{
public void Preload(string[] parameters)
{
// for instance, load classifiers from DB
// and perform any other expensive operations
}
}
}
Pēc piegādātāja metodes sekmīga izsaukuma, tīmekļa sistēma tiek atgriezta ierastā kārtībā un gatava sākt apkalpot pieprasījumus.
NB! Tomēr pagaidām, kamēr nav iznācis oficiāli ASP.NET 4 versija, pastāv nelielas domstarpības par šo iespēju. ASP.NET oficiālā dokumentācija raksta, ka applicationHost.config failā ir nepieciešams uzrādīt citus tīmekļa mājvietas elementu atribūtus (attiecīgi “preloadEnabled” un “preloadProvider”). Un attiecīgi laikā, kad notiek preload piegādātāja metodes izsaukums, ASP.NET sistēmai bija jāieslēdzas speciālā režīmā, kurā uz laiku neapstrādā nevienu HTTP pieprasījumu, un lietotājam par to paziņo. ASP.NET oficiālajā dokumentācijā stāv gan rakstīts, ka šāda iespēja ir izmantojot IIS 7.5 uz Windows 2008 R2. Kamēr OS vēl nav apskatīts, neko vairāk nevaru pateikt ;)
Šāda lūk ir jaunā IIS 7.5 iespēja.
Cerams, ka noderēs!