"Eerst laat het werken - dan maak het snel" Is niet altijd juist

U had het programmeeradvies kunnen horen "Maak eerst het werk - dan maak het snel.". Het is niet helemaal fout. Zonder de juiste context wordt het echter vaak verkeerd geïnterpreteerd en niet correct toegepast.

Het advies moet voorkomen dat de ontwikkelaar voortijdig code optimaliseert, die misschien nooit wordt uitgevoerd - of zo zelden wordt uitgevoerd, dat een optimalisatie niet voldoende effect zou hebben om de inspanning in de optimalisering te rechtvaardigen. Bovendien zou optimalisatie kunnen leiden tot complexere code en zo insecten kunnen introduceren. Dus als je ontwikkelaar bent, besteed je niet teveel tijd aan microoptimalisering van elke regel code. Zorg gewoon dat u de juiste gegevensstructuren, algoritmen en bibliotheken hebt gekozen en wacht tot de hotspot-analyse van een analyseprogramma de algemene prestaties verhoogt door een grondiger optimalisatie te kiezen.

Architectuurbeslissingen en artefacten

Het advies "Eerst laat het werken - dan snel maken" is echter volkomen verkeerd als het gaat om "architecturale" beslissingen. Wat zijn architectonische beslissingen? Eenvoudig gezegd, het zijn de beslissingen die duur, moeilijk en/of onmogelijk achteraf te veranderen zijn. Houd er rekening mee dat "duur" soms hetzelfde is als "onmogelijk". Als uw project bijvoorbeeld niet over voldoende middelen beschikt, kunnen dure wijzigingen niet worden doorgevoerd. Infrastructuurveranderingen zijn de allereerste soort veranderingen in die categorie die de meeste mensen in gedachten hebben. Maar er is ook een ander soort 'architectonische' artefacten die erg vervelend kunnen worden om te veranderen:

  1. Stukken code in het midden van een toepassing, waarop vele andere stukken vertrouwen. Als u deze opties wijzigt, moeten alle afhankelijkheden tegelijk worden gewijzigd en opnieuw worden getest.

  2. Artefacten, die in één of ander asynchroon, timing-afhankelijk scenario betrokken zijn waar de input - en zo het gedrag van het systeem zeer willekeurig kan variëren. Wijzigingen kunnen onvoorspelbare effecten hebben en kunnen moeilijk te testen zijn.

  3. Softwarepatronen die steeds opnieuw worden gebruikt en gebruikt in alle onderdelen en onderdelen van het systeem. Als het softwarepatroon suboptimaal blijkt te zijn, moeten alle artefacten die het patroon gebruiken opnieuw worden gecodeerd.

Herinner je? Bovenop deze pagina hebben we gezegd dat de Dispatcher een essentieel onderdeel is van een AEM toepassing. De toegang tot een webtoepassing is zeer willekeurig - gebruikers komen en gaan op onvoorspelbare tijden. Uiteindelijk wordt (of moet) alle inhoud in de Dispatcher in het cachegeheugen opgeslagen. Dus als je goed oplette, had je je kunnen realiseren dat caching gezien kon worden als een 'architectonisch' artefact en dus begrepen moest worden door alle leden van het team, ontwikkelaars en beheerders.

We zeggen niet dat een ontwikkelaar de Dispatcher eigenlijk moet configureren. Zij moeten de concepten kennen - vooral de grenzen - om ervoor te zorgen dat hun code ook door de Dispatcher kan worden gebruikt.

De Dispatcher verbetert de snelheid van de code niet magisch. Een ontwikkelaar moet zijn componenten met de Dispatcher in mening creëren. Daarom moet hij weten hoe het werkt.

Dispatcher Caching - Basisbeginselen

Dispatcher als Http in cache plaatsen - Balans laden

Wat is de Dispatcher en waarom heet het in de eerste plaats "Dispatcher"?

De Dispatcher is

  • Eerst en vooral een cache

  • Een reverse-proxy

  • Een module voor de Apache httpd-webserver, die AEM verwante functies toevoegt aan de veelzijdigheid van de Apache en soepel samenwerkt met alle andere Apache-modules (zoals SSL of zelfs SSI zoals we die later zullen zien)

In de vroege dagen van het Web, zou u een paar honderd bezoekers aan een plaats verwachten. Een opstelling van één Dispatcher, "verzonden"of evenwichtig het laden van verzoeken aan een aantal AEM publicatieservers en die gewoonlijk genoeg - zo, de naam "Dispatcher"was. Deze instelling wordt momenteel echter niet vaak meer gebruikt.

Later in dit artikel zullen we verschillende manieren zien om Dispatchers en Publish-systemen in te stellen. Laten we beginnen met de basisbeginselen van http caching.

Basisfunctionaliteit van het Geheime voorgeheugen van Dispatcher

Basisfunctionaliteit van het Geheime voorgeheugen van Dispatcher

De basisbeginselen van de verzender worden hier uitgelegd. De verzender is een eenvoudige reverse-proxy die in cache kan worden geplaatst en waarmee HTTP-aanvragen kunnen worden ontvangen en gemaakt. Een normale verzoek-/responscyclus gaat als volgt:

  1. Een gebruiker vraagt een pagina aan
  2. De Dispatcher controleert of er al een gerenderde versie van die pagina is. Laten we aannemen dat dit het allereerste verzoek voor deze pagina is en dat de Dispatcher geen lokale kopie in de cache kan vinden.
  3. De Dispatcher vraagt de pagina op van het Publish-systeem
  4. Op het Publish-systeem wordt de pagina weergegeven door een JSP- of een HTML-sjabloon
  5. De pagina wordt geretourneerd aan de Dispatcher
  6. De Dispatcher plaatst de pagina in de cache
  7. De Dispatcher geeft de pagina weer aan de browser
  8. Als dezelfde pagina een tweede keer wordt opgevraagd, kan deze rechtstreeks worden aangeboden vanuit de Dispatcher-cache zonder dat deze opnieuw moet worden weergegeven op de Publish-instantie. Hiermee bespaart u wachttijd voor de gebruikers- en CPU-cycli op de Publish-instantie.

In de laatste sectie hadden we het over "pagina's". Maar hetzelfde schema geldt ook voor andere bronnen, zoals afbeeldingen, CSS-bestanden, PDF-downloads enzovoort.

Hoe gegevens in cache worden geplaatst

De Dispatcher-module maakt gebruik van de faciliteiten die de hostserver voor Apache biedt. Bronnen zoals HTML-pagina's, downloads en afbeeldingen worden als eenvoudige bestanden opgeslagen in het Apache-bestandssysteem. Zo eenvoudig is het.

De bestandsnaam wordt afgeleid door de URL van de gevraagde bron. Als u een bestand aanvraagt /foo/bar.html , wordt het opgeslagen onder /var/cache/docroot/foo/bar.html .

Als alle bestanden in het cachegeheugen worden opgeslagen en dus statisch in de Dispatcher worden opgeslagen, kunt u in principe de stekker van het Publish-systeem aansluiten en de Dispatcher als een eenvoudige webserver gebruiken. Maar dit is slechts een illustratie van het principe. Het echte leven is ingewikkelder. U kunt niet alles in het cachegeheugen plaatsen en de cache is nooit volledig "vol", omdat het aantal bronnen oneindig kan zijn vanwege de dynamische aard van het renderingsproces. Het model van een statisch bestandssysteem helpt een globaal beeld te genereren van de mogelijkheden van de verzender. En het helpt om de beperkingen van de verzender te verklaren.

De AEM URL-structuur en bestandssysteemtoewijzing

Als u meer inzicht wilt krijgen in de Dispatcher, kunt u de structuur van een eenvoudige voorbeeld-URL herzien. Kijk naar het onderstaande voorbeeld.

http://domain.com/path/to/resource/pagename.selectors.html/path/suffix.ext?parameter=value&otherparameter=value#fragment

  • http geeft het protocol aan

  • domain.com is de domeinnaam

  • path/to/resource is het pad waaronder de bron wordt opgeslagen in CRX en vervolgens in het bestandssysteem van de Apache-server.

Van hieruit verschillen de dingen een beetje tussen het AEM en het Apache-bestandssysteem.

In AEM

  • pagename is het resourcelabel

  • selectors staat voor een aantal kiezers die in Sling worden gebruikt om te bepalen hoe de bron wordt weergegeven. Een URL kan een willekeurig aantal kiezers hebben. Ze worden gescheiden door een punt. Een sectie met kiezers kan bijvoorbeeld 'frans.mobile.fancy' zijn. Kiezers mogen alleen letters, cijfers en streepjes bevatten.

  • html als laatste van de "kiezers" wordt een extensie genoemd. Bij AEM/Verdelen bepaalt het ook gedeeltelijk het renderscript.

  • path/suffix.ext is een padachtige expressie die een achtervoegsel kan zijn van de URL. Het kan in AEM manuscripten worden gebruikt om verder te controleren hoe een middel wordt teruggegeven. Later hebben we een volledige sectie over dit onderdeel. Vooralsnog zou het moeten volstaan om te weten u het als extra parameter kunt gebruiken. Achtervoegsels moeten een extensie hebben.

  • ?parameter=value&otherparameter=value is de querysectie van de URL. Deze wordt gebruikt om willekeurige parameters door te geven aan AEM. URL's met parameters kunnen niet in de cache worden geplaatst en parameters moeten daarom worden beperkt tot gevallen waarin ze absoluut noodzakelijk zijn.

  • #fragment wordt het fragmentgedeelte van een URL niet doorgegeven aan AEM het alleen in de browser wordt gebruikt. In JavaScript-frameworks wordt het fragmentgedeelte niet doorgegeven als 'parameters routeren' of om naar een bepaald deel van de pagina te gaan.

In Apache (verwijzing het hieronder diagram),

  • pagename.selectors.html wordt gebruikt als de bestandsnaam in het bestandssysteem van de cache.

Als de URL een achtervoegsel path/suffix.ext heeft,

  • pagename.selectors.html wordt gemaakt als een map

  • path een map in de map pagename.selectors.html

  • suffix.ext is een bestand in de map path . Opmerking: als het achtervoegsel geen extensie heeft, wordt het bestand niet in de cache opgeslagen.

lay-out van het Bestandssysteem na het krijgen van URLs van Dispatcher

lay-out van het Bestandssysteem na het krijgen van URLs van Dispatcher

Basisbeperkingen

De toewijzing tussen een URL, de bron en de bestandsnaam is vrij eenvoudig.

Het is echter mogelijk dat u enkele overvullingen hebt opgemerkt.

  1. URL's kunnen erg lang worden. Het toevoegen van het padgedeelte van een /docroot aan het lokale bestandssysteem kan de limieten van bepaalde bestandssystemen gemakkelijk overschrijden. Het runnen van Dispatcher in NTFS op Vensters kan een uitdaging zijn. U bent echter veilig met Linux.

  2. URL's kunnen speciale tekens en umlauts bevatten. Dit is meestal geen probleem voor de verzender. Houd er echter rekening mee dat de URL op veel plaatsen in de toepassing wordt geïnterpreteerd. Vaak hebben we vreemd gedrag van een toepassing gezien - alleen om te weten te komen dat één stukje zelden gebruikte (aangepaste) code niet grondig is getest op speciale tekens. Indien mogelijk moet u deze vermijden. En als je dat niet kunt, plan dan voor grondig testen.

  3. In CRX hebben bronnen subbronnen. Een pagina bevat bijvoorbeeld een aantal subpagina's. Dit kan niet worden gevonden in een bestandssysteem omdat bestandssystemen bestanden of mappen hebben.

URL's zonder extensie worden niet in de cache geplaatst

URL's moeten altijd een extensie hebben. Hoewel u URL's zonder extensies kunt bedienen in AEM. Deze URL's worden niet in de cache opgeslagen in de Dispatcher.

Voorbeelden

http://domain.com/home.html is cacheable

http://domain.com/home is niet cacheable

Dezelfde regel geldt wanneer de URL een achtervoegsel bevat. Het achtervoegsel moet een uitbreiding hebben om cacheable te zijn.

Voorbeelden

http://domain.com/home.html/path/suffix.html is cacheable

http://domain.com/home.html/path/suffix is niet cacheable

Je zou je kunnen afvragen: wat gebeurt er als het resource-part geen extensie heeft, maar het achtervoegsel wel. In dit geval heeft de URL helemaal geen achtervoegsel. Kijk naar het volgende voorbeeld:

Voorbeeld

http://domain.com/home/path/suffix.ext

De /home/path/suffix is het pad naar de bron… dus de URL bevat geen achtervoegsel.

Conclusie

Voeg altijd extensies toe aan zowel het pad als het achtervoegsel. SEO-bewuste mensen beweren soms dat dit je in zoekresultaten rangschikt. Maar een pagina zonder cache zou supertraag zijn en nog verder naar beneden gaan.

Conflicterende achtervoegsel-URL's

U hebt twee geldige URL's

http://domain.com/home.html

en

http://domain.com/home.html/suffix.html

Ze zijn absoluut geldig in AEM. U zou geen probleem zien op uw lokale ontwikkelcomputer (zonder een Dispatcher). Waarschijnlijk zult u ook geen probleem tegenkomen in UAT- of ladingstests. Het probleem waarmee we te maken hebben is zo subtiel dat het de meeste tests overslaat. Het zal u hard raken wanneer u op piektijd bent en u bent beperkt in tijd om het te richten, waarschijnlijk heeft geen servertoegang, noch middelen om het te bevestigen. We zijn er geweest…

Dus… wat is het probleem?

home.html in een bestandssysteem kan een bestand of een map zijn. Niet beide op hetzelfde moment als in AEM.

Als u home.html eerst aanvraagt, wordt deze gemaakt als een bestand.

Volgende aanvragen om home.html/suffix.html retourneren geldige resultaten, maar aangezien het bestand de positie in het bestandssysteem home.html 'blokkeert', kan home.html niet nogmaals als een map worden gemaakt en wordt home.html/suffix.html dus niet in de cache opgeslagen.

dossier dat positie in het filesystem blokkeert die sub-middelen verhinderen om in het voorgeheugen onder te brengen

dossier dat positie in het filesystem blokkeert die sub-middelen verhinderen om in het voorgeheugen onder te brengen

Als u dit andersom doet, wordt eerst een home.html/suffix.html -aanvraag ingediend en wordt suffix.html eerst in de cache geplaatst onder een map /home.html . Deze map wordt echter verwijderd en vervangen door een bestand home.html wanneer u vervolgens home.html als bron aanvraagt.

Deleting a wegstructuur wanneer een ouder als middel wordt gehaald

Deleting a wegstructuur wanneer een ouder als middel wordt gehaald

Het resultaat van wat in cache wordt geplaatst, is volledig willekeurig en afhankelijk van de volgorde van de binnenkomende aanvragen. Wat het nog lastiger maakt, is het feit dat je meestal meer dan één verzender hebt. De prestaties, de aanraaksnelheid en het gedrag van de cache kunnen per Dispatcher verschillen. Als u wilt weten waarom uw website niet reageert, moet u er zeker van zijn dat u naar de juiste Dispatcher kijkt in de ongelukkige volgorde van caching. Als je kijkt naar de Dispatcher die - gelukkig - een gunstiger aanvraagpatroon had, dan ben je verloren bij het zoeken naar het probleem.

Conflicterende URL's voorkomen

U kunt "conflicterende URLs"vermijden, waar een omslagnaam en filename "concurreren"voor de zelfde weg in het dossiersysteem, wanneer u een verschillende uitbreiding voor het middel gebruikt wanneer u een achtervoegsel hebt.

Voorbeeld

  • http://domain.com/home.html

  • http://domain.com/home.dir/suffix.html

Beide zijn perfect kacheable,

Als u een achtervoegsel opvraagt of het achtervoegsel niet helemaal gebruikt, kiest u een toegewezen extensie "dir" voor een resource. Er zijn zeldzame gevallen waarin ze nuttig zijn. En het is gemakkelijk om deze gevallen correct uit te voeren. Zoals we in het volgende hoofdstuk zullen zien wanneer we het hebben over cachevalidatie en flushing.

Niet-cachegeerbare verzoeken

Bekijk een korte samenvatting van het laatste hoofdstuk plus nog enkele uitzonderingen. De Dispatcher kan een URL in cache plaatsen als deze is geconfigureerd als cacheable en als het een GET-aanvraag is. Het kan niet in de cache worden geplaatst op grond van een van de volgende uitzonderingen.

Cacheable Verzoeken

  • Verzoek is geconfigureerd om in de Dispatcher-configuratie cacheable te zijn
  • Aanvraag is een aanvraag voor een gewone GET

niet-Cacheable Verzoeken of Reacties

  • Verzoek dat caching door configuratie (Weg, Patroon, Type MIME) wordt ontkend
  • Reacties die een header "Dispatcher: no-cache" retourneren
  • Reactie die een "Cache-Control: no-cache|private" header retourneert
  • Response that returns a "Pragma: no-cache" header
  • Verzoek met vraagparameters
  • URL zonder extensie
  • URL met achtervoegsel dat geen extensie heeft
  • Reactie die een andere statuscode dan 200 terugkeert
  • Aanvraag POST