Naar hoofdinhoud

Waarom webapplicaties traag worden en waar de tijd echt verdwijnt

Waarom webapplicaties traag worden en waar de tijd echt verdwijnt

Een offerteportaal dat vijf seconden nodig heeft om een klantdossier te openen. Een webshop die het laat afweten op de dag van de actie. Een intern systeem waarin medewerkers na elke klik even naar een half opgebouwd scherm zitten te kijken. Dit soort vertraging wordt vaak weggezet als een technisch detail voor de IT-afdeling, maar het raakt omzet, productiviteit en het vertrouwen van klanten.

Wat in de praktijk opvalt: de oorzaak wordt bijna altijd op één plek gezocht. De hosting. De programmeertaal. Die ene drukke database. Meestal klopt dat beeld niet. Een trage applicatie is doorgaans het gevolg van een keten waarin een paar schakels net niet goed op elkaar aansluiten, en waar elke schakel er een halve seconde bij optelt. Wie alleen het zichtbare symptoom aanpakt, koopt daarmee hooguit een paar maanden rust.

Wat een paar seconden werkelijk kosten

Gebruikers vergelijken zakelijke software niet met andere zakelijke software. Ze vergelijken die, zonder erbij na te denken, met de apps die ze de rest van de dag gebruiken. Een dashboard dat blijft hangen voelt daardoor al snel onbetrouwbaar, ook als de cijfers uiteindelijk gewoon kloppen.

Bij interne processen loopt de schade op zonder dat iemand het terugziet in een rapportage. Vijftig medewerkers die twintig keer per dag vier seconden wachten, zijn samen ruim 250 uur per jaar kwijt. Bij klantgerichte platforms is het effect directer zichtbaar: een traag zoekresultaat, aanvraagformulier of afrekenproces verlaagt simpelweg de kans dat iemand de taak afmaakt.

Dat betekent niet dat alles binnen een halve seconde moet reageren. Een zwaar analyserapport mag best even duren, zolang de gebruiker ziet dat er iets gebeurt en ongeveer weet hoe lang het duurt. Een voorraadcheck tijdens het afrekenen of een scherm dat een servicemedewerker de hele dag openhoudt, is een ander verhaal. Welke snelheid nodig is, volgt uit het bedrijfsproces en niet uit een streefgetal dat ergens in een rapport staat.

Waar de tijd meestal verdwijnt

Queries die zijn meegegroeid met de data

De database is de klassieker, zeker bij applicaties die al een paar jaar meelopen. Een query die prima werkte op honderd records wordt een rem zodra dezelfde tabellen honderdduizenden orders, gebruikers of logregels bevatten. Aan de code is niets veranderd, alleen aan de hoeveelheid data eronder.

De bekende boosdoeners: ontbrekende indexen, selecties die veel meer ophalen dan nodig is, en queries die in een lus staan. Ook het N+1-probleem duikt geregeld op. De applicatie haalt eerst een lijst op en doet daarna voor elk afzonderlijk item nog een losse databaseoproep. Bij tien resultaten valt dat niemand op. Bij duizend resultaten staat de pagina stil.

Meer rekenkracht lost dit zelden op. Eerst moet duidelijk zijn welke query tijd kost, hoe vaak die draait en waarom. Met een paar goed gekozen indexen en gerichtere selecties is vaak meer te winnen dan met een zwaardere server. Indexen zijn overigens geen gratis lunch. Ze versnellen het lezen, maar maken het wegschrijven van grote hoeveelheden data iets trager. Bij tabellen waarin continu wordt geschreven, is dat een reële afweging.

Koppelingen die u niet in de hand hebt

Webapplicaties staan zelden op zichzelf. Ze wisselen gegevens uit met boekhoudsoftware, betaalproviders, CRM- en ERP-systemen, vervoerders, identity providers en marketingtools. Elke externe aanroep is een afhankelijkheid erbij. Reageert één dienst traag, dan staat uw pagina te wachten op een systeem waar u niets over te zeggen heeft.

Een productpagina die bij ieder bezoek live voorraad, prijs, productinformatie en bezorgopties uit vier verschillende systemen ophaalt, kan technisch keurig gebouwd zijn en operationeel toch kwetsbaar. Die twee dingen sluiten elkaar niet uit.

De echte vraag is per gegeven hoe actueel het moet zijn. Een voorraadstand op een overzichtspagina mag meestal een paar minuten oud zijn. Bij het afrekenen niet, want daar moet de reservering hard worden gecontroleerd. Dat onderscheid maken is belangrijker dan de keuze tussen synchroon of asynchroon ophalen. Het gaat er niet om alles los te trekken van de aanvraag, maar om te weten welke informatie een gebruiker gerust een paar minuten oud mag zien.

Te veel werk achter één klik

Iemand klikt op een knop en verwacht een reactie. Achter die knop gebeurt soms veel meer dan nodig is: een export van tienduizend regels genereren, afbeeldingen verwerken, een mailing klaarzetten, gegevens uit drie bronnen samenvoegen. Zolang dat allemaal binnen hetzelfde verzoek gebeurt, kijkt de gebruiker naar een laadicoon.

Dat soort taken hoort in een achtergrondproces. De applicatie bevestigt direct dat de opdracht binnen is, een worker doet het werk, en de gebruiker krijgt bericht zodra het bestand of rapport klaarstaat. Dat scheelt niet alleen wachttijd. Het voorkomt ook dat één zware export alle beschikbare capaciteit opslokt terwijl vijftig anderen zitten te wachten.

Er hoort wel iets bij. Achtergrondverwerking vraagt om wachtrijen die worden bewaakt, foutmeldingen die ergens terechtkomen en herhaalpogingen die niet oneindig doorgaan. Een export die stilletjes is vastgelopen en waar niemand iets van hoort, is geen vooruitgang maar een nieuw probleem. Monitoring is dus onderdeel van de oplossing en niet iets voor later.

Een frontend die is aangegroeid

Niet alle vertraging zit op de server. Een applicatie kan traag voelen omdat de browser te veel JavaScript, stijlen, afbeeldingen en scripts van derden moet binnenhalen en verwerken. Dashboards, portalen en webshops groeien nu eenmaal organisch: er komt een trackingtool bij, een chatwidget, een nieuw component, een testscript. Stuk voor stuk lijkt het weinig. Bij elkaar is het een startscherm van enkele megabytes.

Slecht geoptimaliseerde afbeeldingen blijven daarbij hardnekkig. Een foto van drie megabyte tonen in een vakje van tweehonderd pixels breed kost mobiele gebruikers data en seconden, zonder dat er iets tegenover staat. Hetzelfde geldt voor functionaliteit die op elke pagina wordt geladen terwijl een paar procent van de bezoekers die ooit gebruikt.

De aanpak is niet spannend, maar werkt: bepaal wat op het eerste scherm echt nodig is, laad dat direct en stel de rest uit. Haal eruit wat niemand kan aanwijzen als nuttig. Voor een interne applicatie is een sober en snel scherm bijna altijd prettiger dan een interface vol beweging.

Infrastructuur die niet meer past

Een server kan online zijn en toch tekortschieten. Te weinig CPU, geheugen dat volloopt, trage opslag of een webserver die nooit goed is ingesteld. Zulke problemen pieken op het slechtst denkbare moment: tijdens een mailing, een campagne, de maandafsluiting of een drukke besteldag.

Voor een eenvoudige website met voorspelbaar verkeer is een gedeelde omgeving prima. Voor een bedrijfskritische applicatie met veel gelijktijdige gebruikers, koppelingen en databases is meer controle nodig: gescheiden omgevingen, voldoende resources, caching op de juiste plek en ruimte om mee te groeien. Maar zoals gezegd, capaciteit bijschakelen zonder analyse is geen oplossing. Een inefficiënte applicatie krijgt ook een grotere server moeiteloos vol.

Dit is precies waarom het helpt als ontwikkeling en hosting bij elkaar zitten. Wie de applicatie kent en tegelijk in de infrastructuur kan kijken, herleidt een probleem in een middag in plaats van in drie weken. Er ontstaat dan ook geen driehoeksgesprek tussen ontwikkelaar, hoster en integratiepartner over wie er aan zet is. Bij LJPc behandelen we die lagen daarom als één technisch geheel.

Geen caching, en sessies die in de weg zitten

Sommige gegevens veranderen bijna nooit en worden toch bij elke aanvraag opnieuw berekend: categorieën, instellingen, rechtenstructuren, veelgebruikte overzichten. Zonder caching doet de applicatie steeds hetzelfde werk over. Bij dertig bezoekers per uur merkt niemand dat. Bij duizend wel.

Caching moet u wel bewust inrichten, want een cache die te lang blijft staan toont verouderde informatie. De vraag is per soort gegeven: hoe oud mag dit worden en wanneer moet het worden ververst? Algemene content kan lang blijven staan, gebruikersspecifieke gegevens kort, en een definitieve prijs of voorraadreservering wordt altijd live gecontroleerd. Dat onderscheid maken is het halve werk.

Sessiebeheer wordt daarbij vaak vergeten. Als elke pagina veel sessiedata moet lezen, vergrendelen en terugschrijven, ontstaan er wachtrijen zodra mensen tegelijk werken. Dat zien we vooral bij klantportalen en interne systemen waar tientallen medewerkers de hele dag ingelogd staan.

Eerst meten, dan sleutelen

"Het voelt traag" is een serieus signaal en tegelijk een waardeloze diagnose. Begin dus met cijfers. Hoe lang duurt die pagina of API-aanroep precies? Zit de tijd in de browser, in de applicatie, in de database of in een externe koppeling? Speelt het altijd, alleen bij piekbelasting, of alleen bij één specifieke handeling?

Met logging, performance monitoring en een paar gerichte tests krijgt u een tijdlijn van een verzoek. Daaruit komt vaak iets verrassends: dat negentig procent van de wachttijd door één query komt, of door een externe API die eens per twintig aanroepen tien seconden nodig heeft. Pas met zo'n tijdlijn kunt u prioriteren op effect in plaats van op onderbuikgevoel.

Kijk daarbij verder dan gemiddelden. Een gemiddelde responstijd van één seconde oogt prima, terwijl vijf procent van de aanvragen acht seconden duurt. Die vijf procent bepaalt hoe uw applicatie wordt ervaren, want dat zijn de momenten waar mensen over praten. Meet daarom ook uitschieters, foutpercentages en het gedrag onder realistische belasting.

Sneller maken zonder nieuwe problemen

De snelste technische ingreep is niet altijd de verstandigste. Een cache levert snelheid op en mag nooit verkeerde informatie tonen. Asynchrone verwerking maakt een scherm directer, maar dan moet de statuscommunicatie kloppen. Een index kan een query tien keer sneller maken en hoort getest te zijn voordat hij op productie staat.

Werk daarom in kleine stappen. Pak de grootste aantoonbare vertraging aan, meet opnieuw en kijk wat het doet met stabiliteit en gebruikservaring. In de meeste projecten leveren drie of vier gerichte aanpassingen meer op dan een herbouw. Soms laat de analyse het tegenovergestelde zien en blijkt dat de architectuur, de koppelingen of de hostingomgeving eenvoudigweg niet meer passen bij de huidige schaal. Ook dat is bruikbare informatie, en beter om nu te weten dan na nog een jaar optimaliseren in de marge.

Een snelle webapplicatie is geen trucje. Het is het resultaat van code, database, koppelingen en infrastructuur die samen zijn ingericht op het werk dat uw organisatie er dagelijks van vraagt. Behandel vertraging als een bedrijfsrisico in plaats van als een storing die vanzelf overwaait, en u houdt grip op groei, continuïteit en de ervaring van iedereen die met het systeem werkt.

Blijf op de hoogte van recente ontwikkelingen! Schrijf je in en ontvang onze nieuwsbrief Bezig met aanmelden...