Module 9: Async Flashcards
Wat is asynchroon programmeren?
Asynchrone programmering is een vorm van programmeren waarmee een werkeenheid afzonderlijk van de main thread kan worden uitgevoerd.
Asynchroon programmeren is een vorm van programmeren waarin je minder zekerheid hebt over de volgorde waarin taken uitgevoerd zullen worden. Maar wat je hier voor terug krijgt is een flow waar de thread bezig kan gaan met andere taken wanneer de huidige taak ergens op moet wachten zoals een IO operatie.
Waarom asynchroon programmeren?
Voor het optimaal benutten van resources. Er kan meer/beter gebruik gemaakt worden van de CPU en er kan efficiënter met geheugen omgegaan worden. Dit resulteerd in betere performance, responsiveness en resilience.
Wat is de CompletableFuture?
De CompletableFuture is een klasse waarmee we middels een instantie van deze klasse een async operatie kunnen uitvoeren.
Met welke methode kunnen we (synchronized) toegang krijgen tot het resultaat van een CompletableFuture?
Om toegang te krijgen tot de waarde in een future kan er gebruik gemaakt worden van de get() methode. Deze methode blokkeert de thread totdat de future klaar is.
Wat is de standaard threadpool die gebruikt wordt voor de CompletableFuture?
ForkJoinPool.commonPool().
Welke soorten Threadpools zijn er?
- Fixed, een pool met een vast aantal threads. Goed voor CPU intensieve taken.
- Work stealing, probeert taken zo efficiënt mogelijk te verdelen aan de hand van het ingestelde parallellisme niveau.
- Single, een pool met een enkele thread.
- Cached, een pool waar voor elke taak een thread wordt gemaakt of hergebruikt.
Welke soort Threadpool is in de praktijk meestal de beste keuze?
Fixed.
Wat is Spring Webflux?
Spring WebFlux is een webframework dat bovenop Project Reactor is gebouwd en brengt reactive programming naar Spring.
Spring WebFlux wijkt af van het thread-per-request-blokkeringsmodel in traditionele SpringMVC en gaat naar een multi-EventLoop, async, non-blocking (met Netty standaard) paradigma met tegendruk die meer schaalbaar is en efficiënter dan de traditionele blokkeringscode.
Wat is reactive programming?
Reactive programming is een paradigma dat vertrouwt op asynchrone programmeerlogica om realtime updates van anders statische inhoud af te handelen.
In Spring Webflux wordt er veel gebruik gemaakt van twee publishers. Welke?
- Mono, Bevat een stream waar 0 of 1 element in zit.
- Flux, Bevat een stream waar 0 tot n elementen in zitten.
Wat is het Back pressure mechanisme in Spring Webflux?
In Spring Webflux wordt voorkomen dat een publisher een subscriber overweldigd door gebruik te maken van het back pressure mechanisme.
Het mechanisme werkt op basis van een pull push aanpak. Een subscriber vraagt n elementen op. De publisher stuurt dan de elementen in zijn buffer naar de subscriber. Op deze manier geeft de subscriber zelf aan hoeveel elementen hij kan verwerken.
Welke webserver maakt Spring Webflux standaard gebruik van? En wat is het?
Netty.
Netty is een asynchroon event driven network application framework. Door netty te gebruiken kan je non blocking communicatie verwerkelijken waarin back pressure wordt toegepast.
Wat is het verschil tussen Spring Webflux en Spring MVC?
In Spring MVC wordt wordt gebruik gemaakt van servlets waarin standaard voor elke request een thread wordt aangemaakt waarin blocking calls plaats vinden.
In Spring Webflux worden standaard evenveel threads aangemaakt als de hoeveelheid beschikbare CPU cores. Deze threads handelen binnenkomende requests af d.m.v een event loop waarbij geen blocking calls gemaakt worden.
Is het mogelijk om Servlet containers te gebruiken voor Spring Webflux?
Het is ook mogelijk om servlet containers te gebruiken in Spring Webflux zoals Tomcat en Jetty. Hiervoor wordt dan de asynchrone servlet 3.1 API gebruikt.
Hoe kan je in Spring asynchrone methodes aangeven?
met de @Async annotatie. Voordat je er gebruik van kan maken moet de @EnableAsync annotatie zijn toegevoegd aan de applicatie configuratie.
Welke return types moeten Asynchroon geannoteerde methodes hebben in Spring?
Asynchroon geannoteerde methodes moeten als return type void, Future of CompleteableFuture hebben.
Op welke Executor worden standaard de asynchrone methodes (met de @Async annotatie) geplaatst door Spring?
Standaard worden deze asynchrone methodes door Spring op een SimpleAsyncTaskExecutor geplaatst.
Dit gedrag kan zowel op applicatie niveau als op methode niveau worden overschreven.
Wat is het probleem als je met async en ThreadLocal of transacties werkt?
Een ThreadLocal wordt gebruikt om thread specifieke data op te slaan. Het probleem hiervan in combinatie met async is dat er geen garantie is dat je code door dezelfde thread wordt afgehandeld. In Spring security wordt de user ID in een ThreadLocal opgeslagen. Hierdoor kan je bij bij het gebruik van Future’s niet bij de UserContext.
Het probleem waar je met async in combinatie met transacties tegen aan kan lopen is dat de TransactionContext niet wordt overgenomen naar een nieuwe thread. Een mogelijke oplossing voor dit probleem is het versturen van id’s i.p.v entiteiten waarna de nieuwe thread zelf de entiteit ophaalt.
Wanneer is Cassandra geschikt als database?
Bij grote hoeveelheid aan lees- en schrijfoperaties.
Wat is het CAP theorem?
Het CAP-theorema, ook bekend als Brewers theorema, stelt dat het onmogelijk is voor een gedistribueerd computersysteem om gelijktijdig aan de volgende drie voorwaarden te voldoen:
- Consistency
Alle nodes in het systeem zien dezelfde data op hetzelfde moment. - Availability
De beschikbaarheid zegt iets over aanvragen (requests) en antwoorden (responses). Iedere aanvraag krijgt altijd een (niet-foutief) antwoord terug, ongeacht de consistentie van dit antwoord. - Partition Tolerance
Het systeem blijft functioneren bij het uitvallen van een of meerdere nodes (computers/servers) in het netwerk.Partitie Tolerantie
Wat is eventual consistency?
Eventuele consistentie is een garantie dat wanneer een update wordt uitgevoerd in een gedistribueerde database, die update uiteindelijk wordt weerspiegeld in alle nodes die de gegevens opslaan, wat resulteert in hetzelfde antwoord elke keer dat de gegevens worden opgevraagd.
Wat is SimpleAsyncTaskExecutor?
TaskExecutor-implementatie die voor elke taak een nieuwe thread start en deze asynchroon uitvoert.
Wat is een Keyspace (Cassandra)?
Een keyspace is het buitenste object dat bepaalt hoe gegevens worden gerepliceerd op nodes. Keyspaces bestaan uit objecten die column families worden genoemd (die lijken op tabellen in RDBMS), rijen die zijn geïndexeerd op sleutels, gegevenstypen, replicatiefactor.
Welke methodes kun je aanroepen om een CompletableFuture aan te maken?
- CompletableFuture CompletableFuture.runAsync(Runnable)
- CompletableFuture CompletableFuture.supplyAsync(Supplier)