Ga naar hoofdinhoud

Te veel verzoeken: wat een verzoek kost

Hier bouw je op verder: Modules importeren

Weet je dit niet meer zeker? Lees het terug voordat je verdergaat.

Je server uit les 1 antwoordt op GET /. Voor jou is dat één regel in de adresbalk. Voor je server is het werk: het verzoek komt binnen, FastAPI zoekt welke functie erbij hoort, die functie draait, en het antwoord gaat terug. Pas daarna is de server klaar met dit verzoek. Een server heeft dus een grens aan hoeveel verzoeken hij per seconde aankan. Hoe lang één verzoek duurt, meet je met een script.

Eén verzoek meten​

Start je server met fastapi dev main.py. Maak daarnaast een los bestand meet.py. Het speelt de rol van bezoeker, met httpx, zoals in Een script als bezoeker.

import httpx

antwoord = httpx.get("http://127.0.0.1:8000/")

print(antwoord.status_code)
print(antwoord.json())
print(round(antwoord.elapsed.total_seconds() * 1000, 1), "milliseconden")
  1. Regel 3:

    httpx.get doet wat de browser doet als je een adres intypt: een GET-verzoek sturen en wachten op het antwoord. :8000 is de poort van fastapi dev.

  2. Regel 5-6:

    De statuscode en de inhoud van het antwoord. 200 betekent gelukt.

  3. Regel 7:

    elapsed is de tijd tussen versturen en antwoord. total_seconds() geeft seconden; keer duizend zijn het milliseconden, en round(…, 1) houdt één cijfer achter de komma over.

Sla meet.py op. fastapi dev start dan opnieuw, want het ziet een nieuw .py-bestand in zijn map. Wacht tot in de terminal van je server weer Application startup complete staat, en draai het script dan in een tweede terminal.

Een milliseconde is een duizendste van een seconde, dus een paar milliseconden is heel kort.

Wat dat getal betekent​

Duurt één antwoord 2 milliseconden, dan kan je server er ongeveer 500 per seconde geven, als ze netjes na elkaar komen. Dat is ruim genoeg voor een klas vol bezoekers. Maar het is geen oneindig getal. Komen er meer verzoeken dan de server kan beantwoorden, dan moeten ze wachten, en wie te lang wacht, krijgt geen antwoord meer.

Een endpoint dat meer doet, bijvoorbeeld alle berichten uit de database halen, kost meer tijd per verzoek. Dan ligt de grens lager.

Controlevraag
Je server kan 500 verzoeken per seconde beantwoorden. Een minuut lang komen er 600 per seconde binnen. Wat gebeurt er met de verzoeken die nog op een antwoord wachten?
Kies wat jij denkt. Bij het goede antwoord zie je de uitleg.

Er gaat iets mis​

Connection refused​

httpx.ConnectError: [Errno 111] Connection refused

Oorzaak: je server draait niet. Het script klopt aan op 127.0.0.1:8000, maar daar luistert niemand. Op Windows en macOS staat er een ander getal of een andere tekst achter ConnectError, met hetzelfde idee.

Oplossing: start je server in een aparte terminal met fastapi dev main.py, en draai het script pas als daar Application startup complete staat.

Honderden milliseconden​

Het script print geen paar milliseconden, maar iets als 830.0 milliseconden.

Oorzaak: je draaide het script meteen nadat je het opsloeg. Je server was nog aan het opnieuw starten, en je verzoek wachtte daarop.

Oplossing: wacht tot Application startup complete in de terminal van je server staat, en draai het script opnieuw. Zie ook Je server start opnieuw als je een script opslaat.

Opdrachten​

Opdracht 1: Predict - Hoeveel per seconde?​

Een ander endpoint haalt alle berichten uit het gastenboek. Eén antwoord duurt daar 20 milliseconden.

Vraag: hoeveel verzoeken per seconde kan de server daar ongeveer beantwoorden, als ze na elkaar komen?

Tip

Een seconde is 1000 milliseconden.

Antwoord

Ongeveer 50: 1000 milliseconden gedeeld door 20. Tien keer zo veel werk per verzoek betekent tien keer zo weinig verzoeken per seconde.

Opdracht 2: Run - Drie keer meten​

Draai meet.py drie keer achter elkaar. Is de tijd elke keer hetzelfde?

Antwoord

Nee, elke keer een beetje anders, bijvoorbeeld 2,3 en 1,8 en 2,1 milliseconden. Je computer doet ook andere dingen tegelijk, en dat merk je in de laatste cijfers. Sla je tussendoor iets op, dan is de eerste keer daarna veel trager; dat staat bij Er gaat iets mis.

Door naar les 3: zelf twintig verzoeken.