Cachelagring av instansmetadata

Alla utvecklare vill att deras program ska köras snabbare. I den här artikeln visar vi hur du kan lägga till en enda kodrad så att din app som använder MSAL Python kan hämta en token ungefär 1,5 till 2 gånger snabbare!

Förberedelse

  1. Först ska vi välja ett befintligt exempelskript för att demonstrera det här experimentet. Vi väljer användarnamnets lösenordsexempel eftersom det inte kräver någon användarinteraktion, så att vår tidsmätning inte påverkas av långsam mänsklig interaktion.

  2. Konfigurera en config.json för ditt exempel per instruktion.

  3. För att mäta tiden bör du lägga till det här valfria kodfragmentet allra först i exempelkoden:

    import time; t = time.time()
    

    och sedan lägger du till den här raden i slutet av exemplet:

    print("It took", time.time() - t, "second(s)")
    

    Helst bör du kommentera ut de här raderna med det faktiska Microsoft Graph API-anropet, eftersom det inte är en del av hämtningen av token. Slutligen kan du också avkommentera dessa två rader för att aktivera loggning så att du kan se vad som händer under huven.

före

Kör det nu flera gånger. Du kommer att vilja se utdata så här:

$ python username_password_sample.py config.json
It took 0.9160797595977783 second(s)

$ python username_password_sample.py config.json
It took 0.7800290584564209 second(s)

$ python username_password_sample.py config.json
It took 0.8385567665100098 second(s)

Det tog alltså ungefär 0,8 + sekunder att hämta en token.

Faktisk magi

Nu ska vi ha lite kul.

Installera en modul från tredje part "requests-cache" genom att köra den här en gång: pip install requests-cacheoch lägg sedan till den här raden i början av exemplet:

import requests_cache; requests_cache.install_cache()

Efter

Kör det nu flera gånger. Du kommer att vilja se utdata så här:

$ python username_password_sample.py config.json
It took 0.41900205612182617 second(s)

$ python username_password_sample.py config.json
It took 0.480008602142334 second(s)

$ python username_password_sample.py config.json
It took 0.44204020500183105 second(s)

Det tog alltså ungefär 0,4 + sekunder att hämta en token.

Vad är det som händer?

Innan MSAL kan hämta en token skulle det behöva anropa flera slutpunkter för identifiering för att hitta viss metadata. Dessa metadata ändras sällan, så de kan cachelagras och återanvändas. Allt detta är standardpraxis som sker i HTTP-lagret, det är därför MSAL Python inte behöver implementera sådant beteende på egen hand, och ett allmänt HTTP-cachebibliotek skulle göra det här jobbet åt oss.

I vårt fall använder MSAL Python redan ett populärt HTTP-bibliotek med namnet requests, och dessutom finns det ett annat generellt bibliotek, requests-cache, som är utformat för att modifiera requests och automatiskt ge stöd för HTTP-cachelagring. Ännu bättre är att standardbeteendet är att spara den på disk, så vårt exempel på kommandoraden fortfarande drar nytta av en sådan HTTP-cache, trots att det startas som en ny process varje gång.

I själva verket hjälper det här tricket inte bara MSAL Python, det förbättrar all annan cache-kapabel HTTP-trafik i din app.

Conclusion

Nu har du det, en enorm prestanda på 1,5 till 2x med bara en enda rad kod. Och det är universellt tillämpligt för alla dina appar som använder HTTP.

Glad Hacking!