<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>reactive &#8211; Smals Research</title>
	<atom:link href="https://www.smalsresearch.be/tag/reactive/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.smalsresearch.be</link>
	<description></description>
	<lastBuildDate>Thu, 09 Apr 2026 12:23:18 +0000</lastBuildDate>
	<language>en-GB</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://www.smalsresearch.be/wp-content/uploads/2026/01/cropped-cropped-Smals_Research-32x32.png</url>
	<title>reactive &#8211; Smals Research</title>
	<link>https://www.smalsresearch.be</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Voorbij aan REST: Event-Driven APIs</title>
		<link>https://www.smalsresearch.be/event-driven-apis/</link>
		
		<dc:creator><![CDATA[Koen Vanderkimpen]]></dc:creator>
		<pubDate>Tue, 30 Nov 2021 10:23:22 +0000</pubDate>
				<category><![CDATA[[NL]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[cloud computing]]></category>
		<category><![CDATA[CQRS]]></category>
		<category><![CDATA[EDA]]></category>
		<category><![CDATA[Event]]></category>
		<category><![CDATA[Eventual Consistency]]></category>
		<category><![CDATA[methodology]]></category>
		<category><![CDATA[reactive]]></category>
		<category><![CDATA[Resilience]]></category>
		<category><![CDATA[rest]]></category>
		<category><![CDATA[Software architectures]]></category>
		<category><![CDATA[software engineering]]></category>
		<category><![CDATA[standards]]></category>
		<category><![CDATA[vortex]]></category>
		<guid isPermaLink="false">/?p=16655</guid>

					<description><![CDATA[We hadden het op deze blog reeds uitvoerig over het gebruik van APIs als bouwsteen voor herbruikbare software. RESTful APIs hebben uiteraard heel wat voordelen, maar toch moeten we opletten dat we ze niet altijd en overal gaan inzetten. Er zijn namelijk ook nadelen verbonden aan deze manier van werken. Met deze blog willen we [&#8230;]]]></description>
										<content:encoded><![CDATA[
<div class="wp-block-image"><figure class="alignleft size-full is-resized"><a href="/wp-content/uploads/2021/11/EventAPI-1.png"><img decoding="async" src="/wp-content/uploads/2021/11/EventAPI-1.png" alt="" class="wp-image-16720" width="179" height="179" srcset="https://www.smalsresearch.be/wp-content/uploads/2021/11/EventAPI-1.png 240w, https://www.smalsresearch.be/wp-content/uploads/2021/11/EventAPI-1-150x150.png 150w" sizes="(max-width: 179px) 100vw, 179px" /></a></figure></div>



<p class="justify-text">We hadden het op deze blog reeds uitvoerig over het gebruik van <a href="/the_api_event/" data-type="post" data-id="15137">APIs als bouwsteen</a> voor <a href="/hergebruik-de-dos-en-donts/" data-type="post" data-id="13002">herbruikbare software</a>. <a href="/data-centric-it-met-rest/" data-type="post" data-id="9535">RESTful APIs</a> hebben uiteraard heel wat voordelen, maar toch moeten we opletten dat we ze niet altijd en overal gaan inzetten. Er zijn namelijk ook nadelen verbonden aan deze manier van werken. Met deze blog willen we er op wijzen dat asynchrone, <a href="/het-event-als-leidend-voorwerp-in-software-engineering/" data-type="post" data-id="8942">Event-Driven communicatie</a> tussen de systemen soms een veel beter resultaat oplevert, dan het zuivere gebruik van RESTful APIs.</p>



<span id="more-16655"></span>



<h2 class="wp-block-heading">REST: de gouden standaard</h2>



<p class="justify-text">We hebben er zelf reeds enkele malen op gehamerd: <a href="/groei-van-rest-json-standaarden-voor-identity-management/" data-type="post" data-id="2327">RESTful APIs zijn al jaren de de facto standaard</a> voor de communicatie tussen services en hebben ons tal van voordelen gebracht. Zo maken ze het b.v. eenvoudig om diensten te kunnen ontwikkelen op een technologie-agnostische manier, zolang de API maar goed gestandaardiseerd is. Een REST API geeft je ook rechtstreekse controle over wat een service voor jou doet en laat toe om <a href="/newsql-een-upgrade-voor-je-oude-database/" data-type="post" data-id="13610">gedistribueerde transacties</a> uit te voeren.</p>



<p class="justify-text">Het belangrijkste voordeel van REST is dat de technologie heel goed ingeburgerd en breed geaccepteerd is. Het is daardoor makkelijk om ontwikkelaars te vinden die ermee om kunnen gaan. Ondertussen zijn er ook tal van goede raamwerken rond gebouwd en ook standaarden voor de definitie en omschrijving van APIs, waardoor RESTful APIs de ultieme <a href="/hergebruik-de-dos-en-donts/" data-type="post" data-id="13002">bouwstenen van herbruikbaarheid</a> zijn geworden.</p>



<p class="justify-text">Het gevaar is echter dat RESTful APIs zó nuttig zijn, dat ze als een gouden hamer gaan worden gebruikt: deze RESTful hamer werkt zo goed, dat elk project en elk probleem als een spijker wordt beschouwd. Kortom, de technologie wordt steevast toegepast, daar waar soms andere keuzes een betere oplossing kunnen vormen. Er zijn namelijk een aantal nadelen verbonden aan een aanpak enkel en alleen gebaseerd op APIs&#8230;</p>



<h2 class="wp-block-heading">De pure API aanpak</h2>



<p class="justify-text">Wanneer we tegenwoordig <a href="/architecturale-evoluties-deel-1/" data-type="post" data-id="11434">software ontwikkelen</a>, zullen we dit niet meer monolitihisch doen. Om de beschikbaarheid te verhogen en om elastisch schaalbare diensten te bouwen, zullen we de functionaliteit zo goed mogelijk verdelen over een aantal <a href="/van-n-tier-naar-microservices/" data-type="post" data-id="9702">zo klein mogelijke services, mogelijks zelfs microservices</a>. Deze zullen dan samen, onderling communicerend, alle functionaliteit voor een applicatie, of meerdere applicaties, implementeren. Bij een enigszins naïeve aanpak zal men al deze communicatie eenvoudigweg voorzien d.m.v. het gebruik van RESTful APIs, en zal elke dienst de andere diensten synchroon oproepen wanneer deze de functionaliteit ervan nodig heeft.</p>



<p class="justify-text">Voor alle duidelijkheid: een synchrone oproep is een oproep die onmiddellijk antwoord verwacht van de tegenpartij. Een asynchroon bericht is éénrichtingsverkeer (al kan er &#8211; later &#8211; wel een antwoord komen in de vorm van een ander asynchroon bericht; het verschil is dat de eerste partij niet wacht op een antwoord en gewoon zijn werk verder zet).</p>



<div class="wp-block-image"><figure class="aligncenter size-full"><a href="/wp-content/uploads/2021/11/PureApi-1.png"><img fetchpriority="high" decoding="async" width="703" height="368" src="/wp-content/uploads/2021/11/PureApi-1.png" alt="" class="wp-image-16673" srcset="https://www.smalsresearch.be/wp-content/uploads/2021/11/PureApi-1.png 703w, https://www.smalsresearch.be/wp-content/uploads/2021/11/PureApi-1-300x157.png 300w" sizes="(max-width: 703px) 100vw, 703px" /></a><figcaption>Figuur 1: De Webstore, met enkel synchrone communicatie (via APIs) tussen microservices.</figcaption></figure></div>



<p class="justify-text">Laten we het voorbeeld in Figuur 1 bespreken: Het betreft een webwinkel, opgebouwd via een microservices aanpak, waarbij alle microservices met elkaar communiceren via hun APIs. In de figuur staan 14 point-to-point afhankelijkheden; we zullen deze overlopen aan de hand van een typisch scenario. </p>



<ol class="justify-text wp-block-list"><li>De gebruiker logt in (REST call van Webstore Site naar Customer voor de gebruikersgegevens)</li><li>Customer doet ook een call naar Cart om een eerder opgeslagen winkelkarretje in te laden</li><li>De gebruiker winkelt: calls naar Catalog (query) en calls naar Cart (update)</li><li>Op zijn beurt zal Catalog de Inventory service aanroepen om te zien wat voorradig is</li><li>De gebruiker wil afrekenen: call van Site naar Checkout</li><li>Checkout roept Customer en Cart op, om de adresgegevens van de klant in te laden en de inhoud van het karretje</li><li>Call van Checkout naar Shipping voor de verzendingskost</li><li>Achter de schermen roept Shipping hiertoe mogelijks een externe API op van de koerier</li><li>De betaling wordt gestart: call van Checkout naar Payment</li><li>Payment roept Customer op voor de opgeslagen betalingsgegevens</li><li>Na de betaling werkt de Checkout module het order af met een Call naar Shipping en naar Inventory</li><li>Ook Orders krijgt een call om het afgewerkte order op te slaan</li><li>De klant kijkt zijn bestellingen nog eens na: call van Customer naar Orders</li></ol>



<p class="justify-text">Zoals we kunnen zien heeft de microservices approach al een<a href="/architecturale-evoluties-deel-2/" data-type="post" data-id="11475"> voordeel tegenover de monolithische aanpak</a>: er mogen een paar services plat zijn, en mensen kunnen toch winkelen (zonder in te loggen zijn enkel cart, catalog en eventueel inventory nodig). Enkel tijdens een checkout zijn zowat alle services nodig (behalve de catalog).</p>



<p class="justify-text">Dit laatste blijft natuurlijk een probleem: door de vele onderlinge afhankelijkheden tussen de services, kunnen er cascades ontstaan: de onbeschikbaarheid van één service kan de werking van vele andere verstoren en zelfs verhinderen. Daarnaast moet men met al deze afhankelijkheden rekening houden wanneer men een nieuwe versie van een service wil bouwen. Verder is het ook zo dat we van alles impliciet een transactie maken (en als één stap faalt, faalt de hele transactie), terwijl dit misschien niet noodzakelijk is op business niveau. Dit transactionele aspect verplicht ons ook om telkens alle stappen opnieuw te doorlopen in geval van een fout, en kan er, indien er zaken weggeschreven worden tijdens de transactie, ook voor zorgen dat we zaken terug actief ongedaan moeten maken indien er een fout is opgetreden, om te vermijden dat de achterliggende <a href="/data-quality-anomalies-transactions-management-system-atms-prototype-work-in-progress/" data-type="post" data-id="14866">data corrupt wordt</a>.</p>



<p class="justify-text">De directe koppeling tussen de vele diensten heeft nog een ander gevolg: de onafhankelijkheid van de microservices komt in het gedrang. Het hoofddoel van een microservices aanpak, is dat men een collectie onafhankelijk opererende diensten verkrijgt, die afzonderlijk van elkaar kunnen opereren en evolueren. Hoe sterker ze echter gekoppeld zijn aan elkaar, hoe minder groot deze onafhankelijkheid wordt.</p>



<h2 class="wp-block-heading">Richting asynchrone communicatie</h2>



<p class="justify-text">We hebben reeds in vorige blogs besproken wat <a href="/geavanceerd-event-driven-engineering/" data-type="post" data-id="9041">Event-Driven Architecture (EDA) is en welke geavanceerde toepassingen er bestaan</a>, gebaseerd op dat paradigma. Kort herhaald, gaat het hier over asynchrone communicatie tussen toepassingen, doordat ze events publiceren en zich op events van andere systemen kunnen abonneren. Dit zorgt voor een extra indirectie tussen de toepassingen, en op die manier kunnen ze onafhankelijker van elkaar opereren. Een EDA systeem is ook erg uitbreidbaar: je kan altijd extra services toevoegen aan het geheel, die reeds bestaande events gaan gebruiken om nieuwe functionaliteit te implementeren, en die op hun beurt nieuwe events kunnen publiceren. <a href="/architecturale-evoluties-deel-2/" data-type="post" data-id="11475" target="_blank" rel="noreferrer noopener">Op die manier krijg je een groeiend ecosysteem van nuttige Events, net zoals je ook met APIs een ecosysteem kan ontwikkelen</a>.</p>



<p class="justify-text">De wereld heeft echter niet stilgestaan sinds onze vorige posts over EDA en ondertussen zijn er op technologisch vlak al heel wat interessante evoluties bijgekomen. Het is nu zelfs vrij gemakkelijk geworden om ook de front-ends van applicaties aan te sluiten op een Event-Driven omgeving. Je kan je natuurlijk gaan afvragen of er ondertussen ook nog geen standaarden bestaan voor EDA, op basis waarvan we herbruikbare zaken kunnen gaan ontwikkelen, en die zijn er ook stilaan. Het voornaamste wat we kunnen doen om EDA goed te kunnen gebruiken, is echter eerst en vooral ze als &#8220;first class citizen&#8221; gaan beschouwen vanaf de business analyse, en niet langer als een louter technische vernuftigheid die een aantal problemen in systemen kan oplossen.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>Beschouw Events als First Class Citizen: neem ze mee in je visie en vanaf de business analyse.</p></blockquote>



<p class="justify-text">De meeste business domeinen zijn intrinsiek Event-gebaseerd. Denk maar aan een aangifte die binnenkomt, een betaling die moet worden gedaan, een taak die is uitgevoerd, &#8230; Dit zijn allemaal &#8220;gebeurtenissen&#8221; die in de business zelf voorkomen en aldus <em>business events</em>. Eén van de taken die zou moeten gebeuren aan de start van elke analyse, is de tijd nemen om aan <strong><a href="/radar-2021/business-radar-2021/" data-type="page" data-id="15411">Event Storming</a></strong> te doen: een soort brainstorm naar alle business events die zich in een bepaald process of domein afspelen. Daarna kan de functionele analyse hier mee verder gaan om te bepalen hoe de communicatie tussen de te ontwikkelen systemen zich zal afspelen en hoe de business processen zullen worden geïmplementeerd.</p>



<p class="justify-text">Op IT vlak zullen de business events, en daarbijkomend waarschijnlijk nog een aantal eerder technische events, zich dan uiteindelijk vertalen in de events die over de bus worden gestuurd en deel kunnen gaan uitmaken van een ecosysteem van herbruikbare events. Daartoe is het ook echter van belang dat de events, net zoals herbruikbare APIs, <em>gecatalogiseerd en goed gedocumenteerd</em> worden, zodat er maximaal voordeel uit het bestaan van deze events kan worden gedistilleerd in nieuwe toepassingen. Wat we dus willen zeggen met &#8220;first class citizen&#8221;, is dat events op dezelfde manier zouden moeten worden behandeld als APIs, in een Event-first strategie. We willen echter niet afdoen van APIs, daarom wordt het een <strong>API+Event-first strategie</strong>.</p>



<h3 class="wp-block-heading">Standaarden voor Asynchrone APIs</h3>



<p>Zoals daarnet aangehaald, zijn er op technisch vlak dus ondertussen verschillende goed ingeburgerde technologieën om asynchrone communicatie te voorzien tussen systemen, en waarmee men dus Events kan ondersteunen. <a href="/de-stille-cloud-machtsgreep/" data-type="post" data-id="5543">De Cloud</a> heeft deze evolutie enorm versneld. We sommen er een aantal op:</p>



<div class="wp-block-image"><figure class="alignright size-full"><a href="https://www.asyncapi.com/blog/openapi-vs-asyncapi-burning-questions"><img decoding="async" width="296" height="235" src="/wp-content/uploads/2021/11/asyncopenapi.jpg" alt="" class="wp-image-16706"/></a><figcaption>Figuur 2: AsyncAPI, de veelbelovende industriestandaard voor Event Driven APIs, vult perfect OpenAPI aan (de standaard voor REST).</figcaption></figure></div>



<ul class="justify-text wp-block-list"><li><strong>Webhooks / REST hooks</strong>. <a href="https://zapier.com/blog/what-are-webhooks/">Ook wel reverse APIs genoemd</a>. Via webhooks kan men nog steeds RESTful werken: er wordt een API aangeboden waar een client een adres van een zogenaamde &#8220;callback API&#8221; kan gaan posten. Later zal de server via dit adres de client kunnen antwoorden. Het voordeel van deze manier van werken is dat men ze op kan laten gaan in de RESTful aanpak. Het nadeel is dat er nog steeds van een synchrone connectie sprake is op het moment van de registratie en op het moment van de callback. Daarnaast is de performantie en veiligheid ook minder dan met de andere methodes.</li><li><strong>Websockets</strong>. Dit is het <a href="https://en.wikipedia.org/wiki/WebSocket">hippe nieuwe protocol voor de browser</a>, waarmee deze een full-duplex kanaal met een webserver kan onderhouden. Full-duplex will zeggen dat men in beide richtingen kan communiceren en dat eender welke kant de communicatie kan starten. Op deze manier kan men dus een webtoepassing in de browser live updaten via events die van de server komen. Deze technologie is dus specifiek nuttig voor het UI-gedeelte van een gedistribueerd systeem: ze zorgt ervoor dat de asynchrone communicatie tot bij de eindgebruiker kan worden gebracht.</li><li><strong>Server Side Events</strong>. Dit is <a href="https://www.w3schools.com/html/html5_serversentevents.asp">een specificatie ingebakken</a> in <a href="/html-5-een-rijke-ervaring-zonder-plugins/" data-type="post" data-id="1426">HTML 5</a>, en daardoor compatibeler dan het nieuwere websockets. Het betreft echter éénrichtingsverkeer, maar dan van de server naar de clients, waardoor men dus een eenvoudigere manier heeft om toch events naar een browser te sturen.</li><li><strong>GraphQL</strong>. Een vrij recente query taal om APIs te beschrijven en bijhorende runtime. Deze technologie wordt gepromoot als meer gericht op de client dan op de server. Dit is omdat de client precies kan uitdrukken wat hij van de server wil krijgen, in plaats van enkel gebruik te kunnen maken van op voorhand vastgelegde zaken, zoals in REST. <a rel="noreferrer noopener" href="https://www.mobilelive.ca/blog/graphql-vs-rest-what-you-didnt-know/" target="_blank">Dit is dus in principe eerder een concurrent voor REST</a>. Je kan echter in GraphQL zogenaamde &#8220;subcriptions&#8221; aanmaken, waardoor de server je op de hoogte kan houden van een aantal zaken, en aldus is ook hier sprake van asycnhrone communicatie waarmee men aan EDA kan doen.</li><li><strong>gRPC</strong>. Dit is een raamwerk dat wordt gepromoot door de Cloud Native Computing Foundation (CNCF). Het is bedoeld om performant Remote Procedure Calls (RPCs) te kunnen maken en aldus eveneens een concurrent voor REST. <a href="https://grpc.io/">gRPC</a> bieft een streaming API aan (<a href="/de-reactive-hype/" data-type="post" data-id="14280">erg handig bij gebruik van de Reactive principes</a>), waarmee ook asynchrone stromen van berichten (en dus ook Events) kunnen worden behandeld.</li><li><strong>CloudEvents</strong>. Ook dit is een <a href="https://cloudevents.io/">initiatief</a> van de &#8220;Serverless Working Group&#8221; van de CNCF. Het betreft een standaardisering van het beschrijven van events op Publisher niveau, waarbij men zich vooral richt op standaard manieren om de metadata te beschrijven. Een jaar geleden kwam versie 1.0.1 uit. Men werkt verder aan verschillende SDK&#8217;s voor talen en er zijn ook specificaties van hoe de standaard te koppelen aan bepaalde technologieën, zoals Event Brokers (de technologie achter de EventBus).</li><li><strong>AsyncAPI</strong>. <a href="https://www.asyncapi.com/">Dit initiatief is de industriestandaard aan het worden. AsyncAPI</a> doet voor EDA wat <a href="https://www.openapis.org/">OpenAPI</a> reeds doet voor RESTful APIs; de twee worden samen ondersteund door de Linux Foundation. Het betreft hier een specificatie van zowel de Events zelf, als de producers en consumers ervan, op een manier die door een computer kan worden verwerkt. Daardoor kan men dan automatisch goede documentatie genereren, aslook stubs voor code, die kan worden gebruikt in de systemen die met de Events zullen omgaan. Deze specificatie gaat veel verder dan CloudEvents, en trekt ook meer aandacht van developers. Ze zit ondertussen aan versie 2.2.0. Op dit moment zijn er ook al verschillende technologieën ondersteund voor de effectieve implementatie van de Events: o.a. Apache Kafka, AMQP, IBM MQ, MQTT, SNS, WebSockets, en JMS.</li></ul>



<p class="justify-text">Ondanks alle nieuwe ontwikkelingen op gebied van EDA, willen we hier echter niet gaan beweren dat alles nu Event-Driven moet worden, en al zeker niet dat we APIs zouden moeten afschaffen. Events zijn, evenmin as APIs, het antwoord op alles. Ook EDA heeft een aantal nadelen: de asynchrone communicatie inherent aan Events, zorgt ervoor dat systemen die events van elkaar willen gebruiken, op een bepaald niveau &#8220;Eventually Consistent&#8221; worden, en dus niet meer transactioneel zijn. Dit kan in principe voordelig zijn op een aantal punten, maar het zorgt ervoor dat het minder makkelijk is om erover te redeneren indien men gewend is dat alles ten allen tijde consistent wordt gehouden. Het zijn dus systemen die soms iets ingewikkelder in elkaar zitten en minder gemakkelijk te voorspellen zijn: je hebt, binnen één systeem, geen directe controle over wat er allemaal zal gebeuren als gevolg van een Event dat je de wereld instuurt (je hebt enkel controle over wat je kan doen met inkomende Events). Dit alles zorgt ervoor dat het niet altijd even gemakkelijk is om zulke (groepen) systemen te testen en debuggen, temeer omdat er ook minder veel mensen te vinden zijn die er ervaring mee hebben.</p>



<p class="justify-text">Maar, zoals reeds gezegd, EDA kan heel krachtig zijn, en leunt vaak sterk aan bij het business model. Het ideale antwoord over wat we nu best gebruiken, zal dus, zoals gewoonlijk, ergens in het midden liggen&#8230;</p>



<h2 class="wp-block-heading">De gebalanceerde aanpak: APIs plus Events</h2>



<p class="justify-text">Zoals we hebben aangetoond in de vorige sectie, heeft een Eventgedreven aanpak een aantal sterke pluspunten; niet in het minst een resiliënter systeem dat beter voorzien is op toekomstige aanpassingen en uitbreidingen en dus tot op business niveau agile is. Uiteraard zijn er ook een aantal beperkingen, en we gaan dus zeker geen pleidooi houden om vanaf nu alle services zuiver Event-driven te maken. Het antwoord zal een hybride aanpak zijn.</p>



<div class="wp-block-image"><figure class="aligncenter size-full"><a href="/wp-content/uploads/2021/11/hybrid.png"><img loading="lazy" decoding="async" width="855" height="422" src="/wp-content/uploads/2021/11/hybrid.png" alt="" class="wp-image-16681" srcset="https://www.smalsresearch.be/wp-content/uploads/2021/11/hybrid.png 855w, https://www.smalsresearch.be/wp-content/uploads/2021/11/hybrid-300x148.png 300w, https://www.smalsresearch.be/wp-content/uploads/2021/11/hybrid-768x379.png 768w" sizes="auto, (max-width: 855px) 100vw, 855px" /></a><figcaption>Figuur 3: De webstore, met een combinatie van synchrone API calls en asynchrone Events</figcaption></figure></div>



<p class="justify-text">We gaven vroeger al een <a href="/architecturale-evoluties-deel-2/" data-type="post" data-id="11475">een eerder abstract voorbeeld van hoe deze verschillende zaken kunnen worden gecombineerd in onze blogs</a>. Nu zullen we dit iets concreter maken: in figuur 3 overlopen we hetzelfde voorbeeld als dat van figuur 1, maar dan met een combinatie van API gebruik en Events.</p>



<ol class="justify-text wp-block-list"><li>De gebruiker logt in (API call naar Customer; &#8220;Login&#8221;-Event 1 )</li><li>De Cart Service ziet event 1 en verstuurt zelf een event met de vorige inhoud van het karretje (&#8220;Cart Updated&#8221;-Event 2 )</li><li>De front-end ziet event 2 en laat de kar-inhoud zien aan de gebruiker</li><li>De gebruiker winkelt (API calls naar Catalog; &#8220;Product Chosen&#8221;-Event 3 )</li><li>De Cart Service ziet event 3 en past het karretje aan (nogmaals &#8220;Cart Updated&#8221;-Event zoals 2, niet apart getoond)</li><li>Ook Checkout ziet de &#8220;Cart Updated&#8221; events en bewaart de aankopen (&#8220;Cart Updated&#8221;-Event zoals 2, niet getoond)</li><li>De gebruiker wil een checkout doen (API calls naar checkout en shipping, voor de verzendingskost)</li><li>De gebruiker bevestigt het order (API call naar checkout; &#8220;Order Confirmed&#8221;-Event 4 )</li><li>Event 4 wordt opgepikt door Cart (kar leegmaken) en Orders (order bewaren)</li><li>Event 4 wordt eveneens gezien door Inventory (Inventory wordt gereserveerd)</li><li>De gebruiker wordt ook omgeleid naar Payment en voert de betaling uit (API call naar payment)</li><li>Er gebeurt een succesvolle betaling (&#8220;Payment Received&#8221;-Event 5 )</li><li>De Orders Service ziet event 5 en stuurt zelf een event (&#8220;Order Ready-to-Pack&#8221;-Event 6 )</li><li>De Shipping Service vangt event 6 en regelt het versturen bij de koerier</li><li>Ook de Inventory service ziet event 6 (Inventory wordt finaal aangepast en pak-opdracht gaat naar magazijn)</li><li>De klant die zijn orders raadpleegt, kan dat nog via een API call (De Orders Service kunnen we via <a href="/geavanceerd-event-driven-engineering/" data-type="post" data-id="9041">CQRS</a> bouwen: het deel dat actief zaken verwerkt en business beslissingen neemt is volledig Event-Driven; een tweede component van de service observeert alle gerelateerde events en bouwt een resulterend relationeel model op, dat makkelijk kan worden gequeried)</li><li>Hier stopt het voorbeeld van Fig. 1, maar we zouden nog verder kunnen gaan: wanneer het pakket klaar staat, zal er opnieuw een event hiervoor zijn en kan de effectieve verzending gebeuren via de koerier. Daarna zijn er nog tracking events, enz.</li></ol>



<p class="justify-text">Een aantal extra opmerkingen betreffende deze manier van aanpakken:</p>



<ul class="justify-text wp-block-list"><li>In dit scenario zien we dat de front-end meer rechtstreeks gebruik maakt van een aantal achterliggende diensten, en er dus in principe van afhankelijk wordt. We moeten echter onthouden dat dit geen alles-of-niets afhankelijkheid is, zoals een aantal van de point-to-point verbindingen in het eerste scenario. De afhankelijkheid geldt enkel voor welbepaalde functionaliteiten, die afzonderlijk van elkaar onbeschikbaar kunnen zijn.</li><li>We hebben hier ook de mogelijkheid de betaling achteraf in orde te brengen indien de betaling zou mislukken of de Payment Service niet beschikbaar is. Shipping schiet pas in actie nadat het event &#8220;Payment Received&#8221; is gepasseerd. In beide scenario&#8217;s hebben we eventuele 3rd party API calls naar Betalingsfirma&#8217;s (b.v. PayPal) achterwege gelaten, wat een extra kans op falen introduceert. In het eerste scenario zou hierdoor de volledige transactie van de bestelling mislukken (hetgeen ook het geval is bij vele echt bestaande webshops, maar b.v. niet bij een geavanceerde webshop als Amazon, waar men de betaling asynchroon achter de schermen kan regelen).</li><li>Zowel de Cart als de Checkout service houden een winkelmandje bij, maar toch verschillen ze. De Cart service is verantwoordelijk voor de opslag van het mandje overheen verschillende gebruikersessies (en kan eventueel nog wishlists en favorieten en dergelijke functionaliteiten aanbieden). De Checkout service houdt het enkel gedurende één sessie bij tot het een effectief order wordt, en voegt de bestemming en de verzendingskost toe. We zouden hier echter kunnen overwegen om de checkout functies ook in Cart onder te brengen.</li><li>Merk op dat we in geen van beide scenario&#8217;s (zuivere API aanpak en hybride) een laatste check van de inventory doen bij het bestellen. Indien echt nodig op business niveau, zouden we dit in beide gevallen synchroon (en transactioneel) doen (met gevolgen voor de resiliency en klantentevredenheid). We kiezen er echter voor op business niveau dit niet te doen en een eventueel stocktekort op business niveau aan te pakken (<a href="/eventual-consistency-1/" data-type="post" data-id="15544">zie het voorbeeld in de blogpost over Eventual Consistency</a>).</li><li>Om de afhankelijkheid van de externe shipping API te reduceren, kunnen we er in beide scenario&#8217;s voor zorgen dat we de prijzen cachen, of zelf op business niveau vastleggen zonder dit dynamisch op te vragen bij de koerier. Op die manier bestaat de afhankelijkheid enkel op het moment van het effectieve aanmaken van de verzending (en later bij het traceren; wat in principe ook best Event-Driven is, maar in externe APIs is dit vaak niet voorzien).</li></ul>



<p class="justify-text">Zoals we kunnen zien aan de hand van dit voorbeeld, kan een hybride aanpak interessante voordelen hebben: de services zijn heel wat minder sterk afhankelijk van elkaar en zijn zelfstandiger. Men kan kiezen op welke events te reageren en welke events uit te sturen, zonder een API te wijzigen; de service kan op deze manier makkelijker evolueren of verplaatst worden. Er is ook een verbeterde resiliëntie: wanneer een service uitvalt, blijven een aantal events onbehandeld. Maar wanneer de service terug online komt, kan dit werk worden ingehaald en gaat het proces gewoon verder. Er is dus sprake van tijdelijke degradatie en uitstel, maar niet van verloren gegane transacties of een cascade van falen. Men moet er wel op letten dat de EventBus een hoog niveau van beschikbaarheid heeft, net zoals de <a href="/productiviteitsverhoging-met-paas/" data-type="post" data-id="5995">andere middleware platformen</a> waar men de applicaties op bouwt, en de onderliggende infrastructuur.</p>



<h2 class="wp-block-heading">Conclusie</h2>



<p class="justify-text">Een Software Development strategie gebaseerd op het bouwen van RESTful APIs is een goed startpunt. We mogen ons echter niet blindstaren op de voordelen van REST en alleen maar van deze oplossing gebruik maken.</p>



<p class="justify-text">Een Eventgedreven aanpak heeft een aantal sterke pluspunten; niet in het minst een resiliënter systeem dat beter voorzien is op toekomstige aanpassingen en uitbreidingen, en dus tot op business niveau agile is.</p>



<p class="justify-text">In een optimaal gebalanceerde Softwareontwikkelingsstrategie is dus zeker ook ruimte voorzien voor asynchrone communicatie en eventual consistency, door gebruik te maken van Event Driven Architecture. Het is dan ook van groot belang hiermee rekening te houden vanaf het vormen van een visie, tijdens de business analyse en daarna doorheen het hele ontwikkelingsproces.</p>


]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Reactive: het Akka framework</title>
		<link>https://www.smalsresearch.be/reactive-het-akka-framework/</link>
		
		<dc:creator><![CDATA[Koen Vanderkimpen]]></dc:creator>
		<pubDate>Tue, 07 Sep 2021 11:59:31 +0000</pubDate>
				<category><![CDATA[[NL]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[akka]]></category>
		<category><![CDATA[aktors]]></category>
		<category><![CDATA[cloud computing]]></category>
		<category><![CDATA[EDA]]></category>
		<category><![CDATA[Event]]></category>
		<category><![CDATA[methodology]]></category>
		<category><![CDATA[multithreading]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[reactive]]></category>
		<category><![CDATA[Resilience]]></category>
		<category><![CDATA[Software architectures]]></category>
		<category><![CDATA[software engineering]]></category>
		<guid isPermaLink="false">/?p=16446</guid>

					<description><![CDATA[In een vorige blog gaven we reeds een uitvoerige inleiding van het &#8220;Reactive&#8221; paradigma. Vermits dit toch wel een belangrijke en invloedrijke zaak geworden is binnen de developer wereld, lijkt het ons nuttig om hier op terug te komen en wat dieper in te gaan op een voorbeeld van een Reactive framework: het Akka framework, [&#8230;]]]></description>
										<content:encoded><![CDATA[
<div class="wp-block-image"><figure class="alignleft is-resized"><img loading="lazy" decoding="async" src="/wp-content/uploads/2021/09/reactive2-edited-1.png" alt="" class="wp-image-16466" width="150" height="150" srcset="https://www.smalsresearch.be/wp-content/uploads/2021/09/reactive2-edited-1.png 155w, https://www.smalsresearch.be/wp-content/uploads/2021/09/reactive2-edited-1-150x150.png 150w" sizes="auto, (max-width: 150px) 100vw, 150px" /></figure></div>



<p class="justify-text">In een <a href="/de-reactive-hype/" data-type="post" data-id="14280">vorige blog</a> gaven we reeds een uitvoerige inleiding van het &#8220;Reactive&#8221; paradigma. Vermits dit toch wel een belangrijke en invloedrijke zaak geworden is binnen de developer wereld, lijkt het ons nuttig om hier op terug te komen en wat dieper in te gaan op een voorbeeld van een Reactive framework: het <em>Akka framework</em>, één van de pioniers binnen de Reactive beweging.</p>



<span id="more-16446"></span>



<h2 class="wp-block-heading">Wat is Reactive alweer?</h2>



<p class="justify-text"><a href="https://www.reactivemanifesto.org/">Reactieve systemen</a> worden gezien als één van de belangrijkste ontwikkelingen om systemen responsiever te maken voor meer veeleisende eindgebruikers, en om overweg te kunnen met de grote hoeveelheid data die moderne systemen overspoelt. Zogenaamde &#8220;wearables&#8221; en andere <a href="/er-zit-een-hacker-in-mijn-diepvries/" data-type="post" data-id="6757">IoT zaken</a> kunnen bijvoorbeeld een constante stroom aan data genereren. Wanneer men dan de data van vele honderden van zulke devices moet verwerken, komen traditionele systemen vaak in de problemen. Maar ook voor &#8216;gewone&#8217; toepassingen kan deze technologie heil brengen, doordat de responsiviteit en resiliëntie ook kunnen worden verhoogd.</p>



<figure class="wp-block-image size-large"><a href="/wp-content/uploads/2021/09/Reactive-Manifesto.png"><img loading="lazy" decoding="async" width="1024" height="416" src="/wp-content/uploads/2021/09/Reactive-Manifesto-1024x416.png" alt="" class="wp-image-16462" srcset="https://www.smalsresearch.be/wp-content/uploads/2021/09/Reactive-Manifesto-1024x416.png 1024w, https://www.smalsresearch.be/wp-content/uploads/2021/09/Reactive-Manifesto-300x122.png 300w, https://www.smalsresearch.be/wp-content/uploads/2021/09/Reactive-Manifesto-768x312.png 768w, https://www.smalsresearch.be/wp-content/uploads/2021/09/Reactive-Manifesto.png 1235w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a><figcaption>Figuur 1: De vier basiseigenschappen van Reactieve systemen en hoe ze zich tot elkaar verhouden.</figcaption></figure>



<p class="justify-text">Aan de grondslag van Reactive ligt het feit dat het &#8220;message driven&#8221; is (Zie Fig. 1). Men zal een systeem bouwen aan de hand van een aantal met elkaar communicerende subsystemen die berichten zullen uitwisselen. Dit kan zowel rechtstreeks als via het <a href="/het-event-als-leidend-voorwerp-in-software-engineering/" data-type="post" data-id="8942">publish/subscribe mechanisme van Events</a>. Deze communicatie is altijd inherent asynchroon. Men weet niet wanneer er op een bericht zal worden gereageerd en men gaat er ook niet expliciet op wachten. Deze vorm van communicatie tussen componenten zorgt ervoor dat ze losjes gekoppeld zijn en locatietransparant. Dit &#8220;message driven&#8221; fundament leidt verder tot verschillende voordelen.</p>



<p class="justify-text">Eerst en vooral zorgt dit voor resiliëntie. Asynchrone communicatie laat toe om componenten veel onafhankelijker van elkaar te laten opereren dan <a href="/data-centric-it-met-rest/" data-type="post" data-id="9535">synchrone communicatie</a>, wat ervoor kan zorgen dat één component verder kan indien de andere (tijdelijk) faalt. De manier waarop berichten behandeld worden bij Reactive maakt ook van foutmeldingen gewone berichten; men behandelt deze als &#8216;first class citizen&#8217;, en niet zozeer als een uitzondering. Het omgaan met fouten en met niet-werkende componenten wordt dan als van nature mee opgenomen in het programmeren van zo&#8217;n systeem.</p>



<p class="justify-text">Ten tweede stijgt ook de elasticiteit. Bij reactieve systemen is de berichtenstroom heel belangrijk. Men kan deze gaan monitoren en ingrijpen wanneer deze sterk in volume toe- of afneemt, en snel reageren door meer componenten op te starten (of te stoppen), om deze berichten af te handelen. Ook het feit dat het systeem bestaat uit een heel aantal samenwerkende componenten, en niet afhankelijk is van een centrale bottleneck, komt de schaalbaarheid ten goede.</p>



<p class="justify-text">Ten slotte moet dit alles samen zorgen voor een verhoogde responsiviteit. Men zorgt ervoor dat men tijdig en vooral binnen een bepaalde tijd kan reageren op alle binnenkomende berichten, voor een consistente Quality of Service.</p>



<h2 class="wp-block-heading">Het Akka raamwerk</h2>



<p class="justify-text"><a href="https://akka.io/">Akka</a> zag het licht in 2009 als één van de eerste raamwerken die het principe van het Actor programmeermodel naar een mainstream server programmeertaal bracht. Het is beschikbaar zowel voor de programmeertaal <a href="https://www.scala-lang.org/">Scala</a> (een taal die werkt op de JVM), waar het in principe voor is gebouwd, als voor Java (waar het iets meer boilerplate code vergt). Tegenwoordig maakt het deel uit van het <a href="https://www.lightbend.com/">Lightbend</a> platform, samen met het <a href="https://www.playframework.com/">Play raamwerk</a> en de taal Scala.</p>



<p class="justify-text">Actoren kan men zien als kleine onafhankelijke machines binnen een softwaresysteem. Ze communiceren enkel met de buitenwereld (en dus met andere actors) via asynchrone berichten. Wanneer een actor een bericht krijgt, kan deze een aantal verschillende dingen doen: lokale code uitvoeren, zijn eigen toestand veranderen, zelf berichten uitsturen, andere actoren creëren, en beslissen hoe op het volgende bericht zal worden gereageerd. Een actor leeft dus volledig binnen zijn eigen executie-stack. Men kan deze dus beschouwen als een apart proces of een aparte thread, maar in een raamwerk als Akka is het mogelijk om deze veel efficiënter te instantiëren dan dat (zelfs threads zijn nog relatieve zwaargewichten, terwijl een actor in akka maar een paar honderd bytes hoeft in te nemen; één thread zal dan ook typisch vele actors tegelijk aansturen). Daarnaast kan men er voor zorgen dat een actor een andere actor als &#8220;supervisor&#8221; krijgt. Deze zal in het oog houden of de gesuperviseerde actor faalt, en kan dus indien nodig gepast reageren.</p>



<p class="justify-text">Eén van de meest interessante zaken aan actors is dat het voor de programmeur transparant kan gemaakt worden waar een actor zich bevindt: het kan een andere actor binnen hetzelfde proces zijn, een actor binnen een ander proces op dezelfde machine, of een actor aan de andere kant van het internet: de programmeur kan deze op dezelfde manier behandelen. Dit is één van de eigenschappen die Akka <em><a href="https://www.cncf.io/">Cloud Native</a></em> maakt: het is een technologie gebouwd vóór de Cloud, waarmee men optimaal kan gebruik maken van de eigenschappen van de Cloud.</p>



<p class="justify-text">Naast de &#8216;core&#8217; Akka bibliotheek, bestaan er ook nog heel wat modulaire uitbreidingen, zoals b.v. voor het werken met streams, persistentie, webservers en http, en allerlei integraties, zoals b.v. met het Play framework, of met Apache Kafka. Ook RESTful APIs worden ondersteund.</p>



<h2 class="wp-block-heading">Een voorbeeld</h2>



<p class="justify-text">In de code duiken zou een beetje te technisch worden, maar we kunnen toch illustreren wat men met deze manier van programmeren kan bereiken aan de hand van een eenvoudig voorbeeld.</p>



<p class="justify-text">In onderstaande figuur zie je een tekening van een aantal actoren in een boekenwinkel systeem en de berichten die ze elkaar sturen: er zijn klanten, de boekenwinkel zelf, en bedienden (die boeken opsturen). Het systeem zal als volgt werken: klanten sturen bestellingen naar de winkel; deze zal de bestellingen verder doorgeven aan een bediende. Deze hebben wat tijd nodig om een bestelling af te handelen, dus er zijn er meerdere, om meer bestellingen aan te kunnen. Hoe de winkel kiest welke taak aan welke bediende te geven, zouden we op verschillende manieren kunnen oplossen (b.v. &#8220;neem een willekeurige vrije bediende&#8221;), maar zoveel detail laten we hier niet zien.</p>



<figure class="wp-block-image size-large"><a href="/wp-content/uploads/2021/09/bookstore-default.png"><img loading="lazy" decoding="async" width="1024" height="485" src="/wp-content/uploads/2021/09/bookstore-default-1024x485.png" alt="" class="wp-image-16459" srcset="https://www.smalsresearch.be/wp-content/uploads/2021/09/bookstore-default-1024x485.png 1024w, https://www.smalsresearch.be/wp-content/uploads/2021/09/bookstore-default-300x142.png 300w, https://www.smalsresearch.be/wp-content/uploads/2021/09/bookstore-default-768x363.png 768w, https://www.smalsresearch.be/wp-content/uploads/2021/09/bookstore-default.png 1192w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a><figcaption>Figuur 2: De boekenwinkel aktors. Bij de standaard werking zullen bestellingen van klanten doorgegeven worden aan een pool van bediendes. Wanneer een boek niet kan worden geleverd, krijgt de klant in de plaats ervan een cadeaubon.</figcaption></figure>



<p class="justify-text">De bediende die een bestelling krijgt wordt &#8220;bezig&#8221; (een andere toestand dan &#8220;vrij&#8221;) en zal uiteindelijk een boek terugsturen naar de klant (in het geval van het IT systeem dat dit systeem modelleert, kan dit b.v. een bericht zijn met de tracking code van het pakket). Daarna wordt de bediende terug &#8220;vrij&#8221;.</p>



<p class="justify-text">Soms gaat er echter iets mis met de bestelling: de bediende vindt b.v. het boek niet dat de klant wil. In dat geval stuurt deze een verontschuldigend bericht terug naar de klant, met een cadeaubon. Als er echter te vaak van deze dingen gebeuren, krijgt een bediende teveel stress en geeft deze er de brui aan (zijn actor gaat in error-modus). Dit geeft dus een foutmelding, die geëscaleerd wordt naar de supervisor van de bediende, in dit geval de winkel (zie Fig. 3). Deze zal dan moeten beslissen wat er met de fout gebeurt: we kiezen ervoor om de bestelling aan een andere bediende te geven en de gestresseerde bediende een paar dagen &#8220;verlof&#8221; te geven (waarna zijn actor terug in toestand &#8220;vrij&#8221; zal komen).</p>



<figure class="wp-block-image size-large"><a href="/wp-content/uploads/2021/09/bookstore-error.png"><img loading="lazy" decoding="async" width="1024" height="722" src="/wp-content/uploads/2021/09/bookstore-error-1024x722.png" alt="" class="wp-image-16460" srcset="https://www.smalsresearch.be/wp-content/uploads/2021/09/bookstore-error-1024x722.png 1024w, https://www.smalsresearch.be/wp-content/uploads/2021/09/bookstore-error-300x211.png 300w, https://www.smalsresearch.be/wp-content/uploads/2021/09/bookstore-error-768x541.png 768w, https://www.smalsresearch.be/wp-content/uploads/2021/09/bookstore-error.png 1121w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a><figcaption>Figuur 3: Illustratie van de verschillende toestanden waarin een bediende zich kan bevinden, plus: wat gebeurt er indien een bediende er de brui aan geeft tijdens een bestelling (Error)? De bediende krijgt verlof van de winkel en de bestelling wordt doorgegeven aan een andere bediende.</figcaption></figure>



<p class="justify-text">Dit voorbeeld illustreert het principe van resiliëntie, gebruikmakende van actoren: de fout wordt niet speciaal als fout behandeld, maar als een bericht naar de winkel, die het probleem op dat niveau kan oplossen. Er wordt ook niet alleen gezorgd voor fout-tolerantie, maar ook voor veerkracht: uiteindelijk zal de foutieve actor worden hersteld en terug ter beschikking komen van de pool. Deze veerkracht maakt net het verschil tussen gewone fout-tolerantie en echte resiliëntie.</p>



<h2 class="wp-block-heading">Besluit</h2>



<p>De meeste bestaande raamwerken voor Reactive systemen focussen zich op het gebruik van streams van berichten/events, en op hoe deze zo efficiënt mogelijk te behandelen. Een raamwerk zoals Akka doet het net iets anders, door gebruik te maken van het actor paradigma. Dit biedt een verfrissende kijk op multi-threaded programming, en kan het bouwen van sommige systemen net iets gemakkelijker maken.</p>



<p class="justify-text">Het gebruik van actoren verhoogt in ieder geval het niveau van abstractie wanneer men over parallellisme en multi-threading probeert te redeneren, een oefening die berucht is voor zijn moeilijkheid.</p>



<p class="justify-text">Actors lijken erg nuttig voor het modelleren van zaken die een toestand en een gedrag vertonen in de echte wereld, zoals mensen, machines, of bedrijven. In het algemeen zijn ze goed inzetbaar wanneer je systeem goed decomposeerbaar is in een set van onafhankelijke taken, of een set van taken die een bepaalde workflow volgt. Ten slotte zijn ze ook erg geschikt voor het programmeren van <a href="/geavanceerd-event-driven-engineering/" data-type="post" data-id="9041">Event Driven systemen</a>.</p>



<p></p>


]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>De &#8220;Reactive&#8221; hype</title>
		<link>https://www.smalsresearch.be/de-reactive-hype/</link>
		
		<dc:creator><![CDATA[Koen Vanderkimpen]]></dc:creator>
		<pubDate>Wed, 11 Mar 2020 09:45:00 +0000</pubDate>
				<category><![CDATA[[NL]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[cloud computing]]></category>
		<category><![CDATA[EDA]]></category>
		<category><![CDATA[methodology]]></category>
		<category><![CDATA[reactive]]></category>
		<category><![CDATA[Resilience]]></category>
		<category><![CDATA[Software architectures]]></category>
		<category><![CDATA[software engineering]]></category>
		<guid isPermaLink="false">/?p=14280</guid>

					<description><![CDATA[U heeft het buzzword &#8220;Reactive&#8221; misschien al gehoord. Deze nieuwe architecturale principes om software mee te bouwen zouden heel wat van de &#8220;problemen&#8221; oplossen waar huidige software mee kampt. De Reactive Revolution zou systemen robuuster, resiliënter en flexibeler maken; klaar om toekomstige requirements sneller op te vangen. Maar wat is hier nu eigenlijk van aan? [&#8230;]]]></description>
										<content:encoded><![CDATA[
<div class="wp-block-image"><figure class="alignleft size-large"><img loading="lazy" decoding="async" width="145" height="145" src="/wp-content/uploads/2020/03/reactive1.png" alt="" class="wp-image-14315"/></figure></div>



<p class="justify-text">U heeft het buzzword &#8220;Reactive&#8221; misschien al gehoord. Deze nieuwe architecturale principes om software mee te bouwen zouden heel wat van de &#8220;problemen&#8221; oplossen waar huidige software mee kampt. De <em>Reactive Revolution</em> zou systemen robuuster, resiliënter en flexibeler maken; klaar om toekomstige requirements sneller op te vangen. Maar wat is hier nu eigenlijk van aan?</p>



<span id="more-14280"></span>



<h2 class="wp-block-heading">Een Beetje Geschiedenis</h2>



<h3 class="wp-block-heading">Het &#8220;Reactive&#8221; Manifest</h3>



<p class="justify-text">De huidige hype rond Reactive Systems is ontstaan in de nasleep van het publiceren van het &#8216;<em><a href="https://www.reactivemanifesto.org/">Reactive Manifesto</a></em>&#8216;. Een manifest is een openbare verklaring die een aantal principes uiteenzet volgens een nadrukkelijke mening en vaak ook mensen uitnodigt deze te onderschrijven. Het reactive manifest werd een eerste keer gepubliceerd door iemand van de firma &#8216;<a href="https://www.lightbend.com/">Lightbend</a>&#8216;, makers van een <a href="/de-vortex-van-enablers/">cloud platform</a> dat volgens deze principes werkt. De tweede en huidige versie van dit manifest dateert van 16 september 2014. Het werd reeds door duizenden mensen onderschreven.</p>



<p class="justify-text">Wat zegt dit manifesto? Een systeem moet <em>responsief, resiliënt, elastisch en message-driven</em> zijn. In de <a href="https://www.lightbend.com/blog/why-do-we-need-a-reactive-manifesto">eerste versie</a> was dit nog <em>interactief, resiliënt, schaalbaar en event-gedreven</em>, maar men wou dit algemener gaan verwoorden. Er wordt in het manifest uiteraard iets dieper ingegaan op elk van deze aspecten, maar niet diep genoeg om nu precies te weten hoe je volgens deze principes software kan bouwen, en waar de naam &#8220;reactive&#8221; nu eigenlijk vandaan komt. Wat dit laatste betreft vinden we meer uitleg in een <a href="https://www.lightbend.com/blog/why-do-we-need-a-reactive-manifesto">blogpost van de oorspronkelijke auteur</a>, en in de <a href="https://github.com/reactivemanifesto/reactivemanifesto/commit/d0c6b5ba4e7d34faf88b237e2fac85564ce4bbf9#diff-04c6e90faac2675aa89e2176d2eec7d8">eerdere versies</a> van het manifest: het gaat om een aantal verschillende principes, die allemaal tot gevolg hebben dat het systeem beter en sneller zal reageren op allerlei zaken:</p>



<ul class="justify-text wp-block-list"><li><em>react to events</em>: the event-driven nature enables the following qualities:</li><li><em>react to load</em>: focus on scalability rather than single-user performance</li><li><em>react to failure</em>: build resilient systems with the ability to recover at all levels</li><li><em>react to users</em>: combine the above traits for an interactive user experience</li></ul>



<h3 class="wp-block-heading">Functional Reactive Programming</h3>



<p class="justify-text">Het woord &#8220;reactive&#8221; zien we in de IT-geschiedenis echter nog veel eerder opduiken: het gaat dan om <a href="https://en.wikipedia.org/wiki/Reactive_programming">Reactive Programming</a>. Dit is een manier om te programmeren die zich toespitst op het omgaan, op een declaratieve manier, met stromen van data en het propageren van veranderingen in die data (en ook met steeds binnenkomende nieuwe data). Ze is sterk verwant aan &#8220;<a href="https://en.wikipedia.org/wiki/Dataflow_programming">Dataflow Programming</a>&#8220;.</p>



<p class="justify-text">Om het iets concreter te maken, kan men dit vergelijken met spreadsheets, zoals gekend van b.v. Excel. Wanneer men in een werkblad een gegeven in een cel verandert, veranderen onmiddellijk alle cellen die van dit gegeven zijn afgeleid, a.h.w. zonder dat er eerst nog expliciete berekeningen voor moesten worden verricht. Uiteraard gebeuren deze berekeningen wel op de achtergrond: Excel maakt dit transparant, net zoals reactieve programmeertalen dit doen voor hun datastromen: verandert er iets in de bron-stroom, dan volgt ook onmiddellijk de uitgangsstroom.</p>



<p class="justify-text">Aan het bovenstaande principe wordt dan nog <a href="https://medium.com/javascript-scene/master-the-javascript-interview-what-is-functional-programming-7f218c68b3a0">Functioneel Programmeren</a> toegevoegd. Dit is een manier van programmeren die zich focust op het vrijwaren van de eigenschappen van pure functies: functies die enkel rekening houden met hun argumenten (niet met toestand elders in het programma) en ook alleen maar een resultaat teruggeven (en dus ook niets veranderen aan de toestand van het programma). Functioneel programmeren maakt het veel gemakkelijker om over code te redeneren. Wanneer met dit doortrekt in een <a href="/architecturale-evoluties-deel-2/">architectuur</a>, bekomt men componenten die men gemakkelijker elastisch kan schalen, die men makkelijker redundant kan uitrollen tegen falen, etc.</p>



<p class="justify-text">Functioneel Reactief Programmeren is momenteel populair en wordt mogelijk gemaakt door een aantal frameworks die goed zijn in te bedden in bestaande platformen. Onder de noemer <a href="https://reactivex.io/">ReactiveX</a> vinden we bijvoorbeeld ondersteuning voor dit paradigma voor een heel aantal populaire talen, vertaald in specifieke libraries per taal (o.a. voor <a href="https://www.udemy.com/blog/kotlin-vs-java-9-benefits-of-kotlin-for-your-business/">Kotlin</a>, Java, .Net, Scala, Python, C++, en Javascript). ReactiveX heeft behoorlijk wat invloed gehad op programmeren en krijgt nog steeds de nodige aandacht op conferenties. Het is goed om deze manier van programmeren als software ontwikkelaar in de toolbox te hebben.</p>



<h3 class="wp-block-heading">Reactive voor Reactive</h3>



<div class="wp-block-image"><figure class="alignright size-large"><img loading="lazy" decoding="async" width="333" height="155" src="/wp-content/uploads/2020/03/reactive2.png" alt="" class="wp-image-14317" srcset="https://www.smalsresearch.be/wp-content/uploads/2020/03/reactive2.png 333w, https://www.smalsresearch.be/wp-content/uploads/2020/03/reactive2-300x140.png 300w" sizes="auto, (max-width: 333px) 100vw, 333px" /><figcaption>Software Ontwikkelaars die volgens de Reactive Principes werken, kunnen dit op hun website aangeven d.m.v. de volgende banner.</figcaption></figure></div>



<p class="justify-text">En wat heeft &#8220;Reactive Programming&#8221; nu uiteindelijk te maken met de eerder genoemde Reactive Systems? In principe kan je reactieve systemen implementeren zonder dit paradigma, maar het gebruik ervan maakt het bouwen van de systemen echter wel een stuk makkelijker. De middelen die worden voorzien door de reactieve programmeerframeworks maken het namelijk een stuk eenvoudiger om &#8220;reactief te zijn&#8221; wanneer men zo&#8217;n systeem bouwt. De meeste zaken die zo&#8217;n systeem in en uitgaan zijn immers te behandelen als datastromen waar men op moet reageren, met als meest typische voorbeeld de stroom van binnenkomende berichten/events.</p>



<h2 class="wp-block-heading">Hoe is dit nu Beter?</h2>



<p class="justify-text">Reactieve systemen zijn <a href="/kosten-besparen-in-de-cloud/">Cloud</a>-native, en focussen op 4 zaken: Responsiviteit, Resiliëntie, Elasticiteit, en asynchrone communicatie via berichten. Uiteraard zijn de eerste 3 van deze kenmerken al voordelen op zich, maar hoe worden deze nu effectief verwezenlijkt?</p>



<p class="justify-text">Het belangrijkste element in de <a href="/architecturale-evoluties-deel-1/">architectuur</a> van Reactieve systemen is de asynchrone communicatie via berichten, meestal onder de vorm van Events. Doordat <a href="/het-event-als-leidend-voorwerp-in-software-engineering/">Consumenten en Producenten van Events</a> elkaar niet hoeven te kennen, bekomen we een grotere onafhankelijkheid van deze componenten ten opzichte van elkaar. Men zegt dan ook dat ze &#8216;loosely coupled&#8217; zijn. Daarenboven zorgt de asynchrone communicatie voor een kleinere latentie en hogere doorvoer van de gegevensuitwisseling tussen de componenten, wat de performantie ten goede komt en zodat de systemen meer &#8216;Responsive&#8217; zijn. De losse koppeling of onafhankelijkheid is iets wat we ook reeds bij <a href="/van-n-tier-naar-microservices/">microservices</a> als thema zagen: zulke componenten worden makkelijker elastisch schaalbaar t.o.v. elkaar en kunnen ook afzonderlijk redundant worden gemaakt, waardoor ze resiliënter worden tegen falen. Indien het <a href="/geavanceerd-event-driven-engineering/">berichtenuitwisselingssysteem</a> een tijdelijke uitval van één van de componenten kan opvangen (door berichten te bufferen b.v.), is ook het systeem als geheel resiliënter dan een systeem waarbij er <a href="/data-centric-it-met-rest/">synchrone comunicatie wordt gebruikt</a> en elke component onmiddellijk antwoord verwacht van een andere.</p>



<p class="justify-text">Uiteraard moeten in het asynchrone geval de componenten die falen ook wel zo snel mogelijk terug online komen, zodat berichten (inkomende datastromen) zo snel mogelijk worden afgehandeld en er in het systeem als geheel geen te grote wachttijden ontstaan (wat ook een vorm van onbeschikbaarheid is).</p>



<h2 class="wp-block-heading">Verschil met Event Driven Architecture?</h2>



<p class="justify-text">De hier opgesomde voordelen lijken sterk op de voordelen van <a href="/het-event-als-leidend-voorwerp-in-software-engineering/">Event Driven Architecture (EDA)</a>, en reactive maakt ook gebruikt van Events. Waar zit dan precies het nieuwe?</p>



<p class="justify-text">De belangrijkste nieuwigheid zit hem in dit geval in de schaal en de benodigde performantie van deze systemen. Waar men in een traditioneel publish-subscribe model af en toe een berichtje kreeg, zit men nu met stromen van data die eigenlijk volcontinu de componenten binnen het systeem bombarderen. Het schaalbaar en elastisch, en ook simpelweg efficiënt maken van elke afzonderlijke component, was nog nooit zo belangrijk.</p>



<p class="justify-text">En dan nog kan het gebeuren dat één component niet meer kan volgen. Er is dan zogezegd een te grote druk (<em>pressure)</em> op de component. Om te vermijden dat deze bezwijkt, heeft men een mechanisme nodig om de rest van het systeem, en dan voornamelijk de bron van de te grote druk, te informeren. Als dit ervoor kan zorgen dat de druk minder wordt, dan kan de component blijven werken en dan is dit voor het systeem als geheel minder erg dan wanneer deze weg zou vallen.</p>



<p class="justify-text">Dit terugkoppelingssignaal noemen we het aangeven van <em>back pressure</em> (de <a href="https://medium.com/@jayphelps/backpressure-explained-the-flow-of-data-through-software-2350b3e77ce7">back pressure</a> zelf is het niet meer kunnen volgen; het niet aankunnen van de inkomende &#8216;druk&#8217;). Het zorgt er dus voor dat het bronsysteem wat minder berichten naar de desbetreffende component zal sturen. Zoiets kan natuurlijk verder propageren doorheen het hele systeem; uiteindelijk kan dit zelfs bij de gebruiker geraken, die dan een mindere performantie merkt. Maar dit is uiteraard nog altijd beter dan een plots falen (<a href="/robotic-process-automation/">graceful degradation</a>). Andere componenten in het systeem kunnen hier op hun beurt ook op gaan reageren en meer middelen beginnen vrijmaken op de onderliggende infrastructuur, zodat men kan gaan schalen om de verhoogde druk beter aan te kunnen.</p>



<p class="justify-text">Het monitoren van falende componenten gaat bij Reactive systemen ook verder dan de traditionele monitoring die we zien vanuit de infrastructuur en op het niveau van het <a href="/productiviteitsverhoging-met-paas/">PaaS platform</a>. Het is deels ingebouwd in de systemen zelf, zodat deze ook zelf de verantwoordelijkheid kunnen nemen. Men maakt hiervoor o.a. gebruik van het zogenaamde actor model en van supervision trees. In detail ingaan op deze zaken zou ons voor deze blog te ver leiden.</p>



<p class="justify-text">Kortom, een Event Driven Architecture vormt de basis waarop allerlei andere, verregaandere zaken mogelijk worden, om uiteindelijk te komen tot iets wat dan &#8220;Reactive&#8221; kan worden genoemd.</p>



<h2 class="wp-block-heading">Besluit</h2>



<p class="justify-text">Reactive systems zijn bedoeld om op grote schaal enorme hoeveelheden werk te verzetten, en dit met een sterke <strong>resiliëntie</strong>. Ze zijn specifiek ontworpen om optimaal in een <strong>Cloud</strong> te kunnen werken.</p>



<p class="justify-text">De truuk bestaat hem eruit de architectuur zodanig op te bouwen dat elke component op zich sterk staat, maar dat ook de communicatie tussen de componenten meehelpt om onverwachte zaken op te vangen. Het belangrijkste paradigma van Reactive is de <strong>asynchrone communicatie</strong>, meestal onder de vorm van <strong>Events</strong>. Daarnaast is het ook nuttig om bij de implementatie gebruik te maken van Functional Reactive Programming.</p>



<p></p>



<p></p>



<h3 class="wp-block-heading">Interessante bronnen</h3>



<p><a href="https://4everinbeta.com/2015/01/15/is-reactive-programming-more-than-just-hype/">https://4everinbeta.com/2015/01/15/is-reactive-programming-more-than-just-hype/</a> </p>



<p><a href="https://www.reactive-streams.org/">http://www.reactive-streams.org/</a></p>



<p><a href="https://blog.redelastic.com/what-is-reactive-programming-bc9fa7f4a7fc">https://blog.redelastic.com/what-is-reactive-programming-bc9fa7f4a7fc</a></p>



<p><a href="https://itnext.io/demystifying-functional-reactive-programming-67767dbe520b">https://itnext.io/demystifying-functional-reactive-programming-67767dbe520b</a></p>



<p><a href="https://www.scnsoft.com/blog/java-reactive-programming">https://www.scnsoft.com/blog/java-reactive-programming</a></p>



<p><a href="https://medium.com/@GumtreeDevTeam/reactive-programming-hype-or-truth-e6fba44ace76">https://medium.com/@GumtreeDevTeam/reactive-programming-hype-or-truth-e6fba44ace76</a></p>



<p><a href="https://spring.io/blog/2016/06/07/notes-on-reactive-programming-part-i-the-reactive-landscape">https://spring.io/blog/2016/06/07/notes-on-reactive-programming-part-i-the-reactive-landscape</a></p>



<p>

_________________________</p>



<p><em>Dit is een ingezonden bijdrage van Koen Vanderkimpen, IT consultant bij Smals Research. &nbsp;Dit artikel werd geschreven in eigen naam en neemt geen standpunt in namens Smals.</em></p>


]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
