Ga naar hoofdinhoud

Te veel verzoeken: zelf twintig verzoeken

Hier bouw je op verder

In les 1 mat je één verzoek. Nu stuur je er twintig achter elkaar naar je eigen server, en tel je hoeveel er antwoord krijgen.

Twintig verzoeken​

Start je server met fastapi dev main.py, met het endpoint uit les 1. Maak een bestand test_verzoeken.py:

import httpx

adres = "http://127.0.0.1:8000/"

gelukt = 0
for nummer in range(20):
antwoord = httpx.get(adres)
print(f"Verzoek {nummer + 1}: status {antwoord.status_code}")
if antwoord.status_code == 200:
gelukt += 1

print(f"Gelukt: {gelukt} van de 20")
  1. Regel 3:

    Alleen je eigen server, zoals in les 1.

  2. Regel 5:

    gelukt telt hoeveel verzoeken antwoord 200 krijgen.

  3. Regel 6-10:

    De for-loop stuurt twintig keer hetzelfde GET-verzoek. Elke keer dat het lukt, gaat de teller één omhoog.

Draai het in een tweede terminal:

python test_verzoeken.py

Je ziet twintig regels met status 200, en aan het eind Gelukt: 20 van de 20. In de terminal van je server staan twintig regels met GET /, één per verzoek.

Dit is de zwakheid​

Twintig verzoeken zijn niets voor je server. Maar kijk wat er gebeurt: elk verzoek krijgt antwoord, hoe vaak het ook komt en van wie. Er is niets in je server dat zegt "zo is het wel genoeg". Zet in gedachten range(20) op range(20000), en laat dat door duizend computers tegelijk doen: zo ziet een DDoS eruit, alleen groter. In les 4 zet je er een grens op.

Er gaat iets mis​

Je ziet Gelukt: 0 van de 20, of het script stopt meteen met een ConnectError.

Oorzaak: bij 0 van de 20 klopt het adres niet: elk verzoek krijgt een 404, bijvoorbeeld omdat er een pad als /test in adres staat terwijl je server alleen / kent. Bij een ConnectError draait je server niet, zoals in les 1.

Oplossing: open http://127.0.0.1:8000/ in je browser. Zie je daar Hallo wereld!, zet dan precies dat adres in adres.

Opdrachten​

Opdracht 1: Predict - Vijftig keer​

Je verandert range(20) in range(50) en draait het script opnieuw.

Vraag: hoeveel verzoeken lukken er, en ligt je server daarna plat?

Tip

Er is nog niets dat je server laat weigeren. En één laptop die verzoeken na elkaar stuurt, is niet sneller dan de server die ze beantwoordt.

Antwoord

Alle vijftig lukken. De laatste regel is:

Gelukt: 50 van de 20

Het getal 20 staat vast in de laatste print. Pas je dat aan naar 50, dan staat er Gelukt: 50 van de 50. Je server ligt niet plat, want verzoeken na elkaar van één computer zijn niet genoeg, zoals in les 2.

Opdracht 2: Investigate - Merkt een bezoeker iets?​

Zet range(20) op range(500). Open tijdens het draaien je startpagina in de browser. Krijg je hem te zien?

Antwoord

Ja. Je browser is één verzoek extra tussen de vijfhonderd, en je server beantwoordt ze allemaal. Om een echte bezoeker buiten te sluiten, moet de server zó druk zijn dat hij achterloopt, en dat lukt niet met verzoeken na elkaar vanaf één laptop. Dat is geruststellend, maar het betekent ook dat je server niet uit zichzelf ingrijpt.

Door naar les 4: een limiet met slowapi.