<?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>API &#8211; Smals Research</title>
	<atom:link href="https://www.smalsresearch.be/tag/api/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.smalsresearch.be</link>
	<description></description>
	<lastBuildDate>Mon, 01 Jun 2026 07:37:39 +0000</lastBuildDate>
	<language>en-GB</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://www.smalsresearch.be/wp-content/uploads/2026/01/cropped-cropped-Smals_Research-32x32.png</url>
	<title>API &#8211; Smals Research</title>
	<link>https://www.smalsresearch.be</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Ecosysteem Architectuur: een Voorbeeld in de Sociale Sector</title>
		<link>https://www.smalsresearch.be/ecosysteem-architectuur-een-voorbeeld-in-de-sociale-sector/</link>
		
		<dc:creator><![CDATA[Koen Vanderkimpen]]></dc:creator>
		<pubDate>Tue, 19 Jul 2022 13:51:16 +0000</pubDate>
				<category><![CDATA[[NL]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[CQRS]]></category>
		<category><![CDATA[EDA]]></category>
		<category><![CDATA[Event]]></category>
		<category><![CDATA[Event Sourcing]]></category>
		<category><![CDATA[methodology]]></category>
		<category><![CDATA[Software architectures]]></category>
		<category><![CDATA[software design]]></category>
		<category><![CDATA[software engineering]]></category>
		<guid isPermaLink="false">/?p=17006</guid>

					<description><![CDATA[In een vorige blog bespraken we hoe een aantal principes rond APIs en Event Driven Architecture de architectuur van een applicatie-ecosysteem konden sturen. Het wordt nu tijd om deze zaken in een voorbeeld te gieten om alles iets duidelijker te maken (deze blog wordt best gelezen met de vorige blog vers in het geheugen). Vandaag [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="justify-text wp-block-paragraph">In een <a href="/ecosysteem-architectuur/" data-type="post" data-id="16980">vorige blog</a> bespraken we hoe een aantal principes rond APIs en Event Driven Architecture de architectuur van een applicatie-ecosysteem konden sturen. Het wordt nu tijd om deze zaken in een voorbeeld te gieten om alles iets duidelijker te maken (deze blog wordt best gelezen met de <a href="/ecosysteem-architectuur/" data-type="post" data-id="16980">vorige blog vers in het geheugen</a>). Vandaag zullen we het hebben over een fictieve &#8220;arbeidsmotor bij de sociale zekerheid&#8221;, binnen een ecosysteem rond werken, loon, prestaties, arbeidsrelaties, enz.</p>



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



<h3 class="wp-block-heading">Disclaimers&#8230;</h3>



<blockquote class="wp-block-quote justify-text is-style-default is-layout-flow wp-block-quote-is-layout-flow" style="font-style:italic;font-weight:400"><p>Eerst en vooral een aantal disclaimers: de auteur is geen expert op vlak van het business domein, en er zijn dus geen garanties betreffende de juistheid van wat er verteld wordt rond deze zaken. Integendeel, er zullen sterke vereenvoudigingen worden gemaakt, en zelfs kleine aanpassingen, om beter te kunnen dienen als voorbeeld voor de technologische principes die we hier in de verf willen zetten. Het is dus eerder te beschouwen als &#8220;geïnspireerd door&#8221; en niet &#8220;gebaseerd op&#8221; hoe de sociale zekerheidssector werkt, en deze laatste moet bovendien heel breed worden genomen: mogelijks zouden sommige van de voorbeeldapplicaties eerder bij werkgevers of sociale secretariaten uitgerold zijn dan bij een instelling van de sociale zekerheid.</p></blockquote>



<blockquote class="wp-block-quote justify-text is-style-default is-layout-flow wp-block-quote-is-layout-flow" style="font-style:italic;font-weight:400"><p>Verder is dit voorbeeld &#8220;greenfield IT&#8221;, en houdt het geen rekening met reeds bestaande toepassingen, legacy software en de in de voorbije jaren, zelfs decennia, opgebouwde complexiteit van de systemen die dit business domein reeds ondersteunen. Daarenboven maken we hier gebruik van geavanceerde Event Driven Architecture concepten, zoals Event Sourcing en CQRS, ook weer ter illustratie van deze technologieën; in de werkelijkheid zijn deze paradigma&#8217;s echter soms van een te grote technische complexiteit om te overwegen, en zullen ze enkel daar worden ingezet waar specifieke, moeilijk te behalen niet-functionele vereisten er om vragen.</p></blockquote>



<h2 class="wp-block-heading">Het voorbeeld: De arbeidsmotor voor de Sociale Zekerheid</h2>



<p class="justify-text wp-block-paragraph">In het voorbeeld krijgen we een aantal applicaties en diensten rond arbeid en zal er voor de integratie gebruikgemaakt worden van <a href="/data-centric-it-met-rest/" data-type="post" data-id="9535">API</a>s en <a href="/het-event-als-leidend-voorwerp-in-software-engineering/" data-type="post" data-id="8942">Event Driven Architecture</a> (EDA). Werkgevers zullen gegevens doorgeven die verband houden met arbeidsrelaties die ze hebben met hun personeel: de aanvang en het stopzetten van contracten, data die verband houdt met geleverde prestaties (&#8220;werkuren&#8221;), en zaken rond het salaris en het uitbetalen ervan. Applicaties voor werkgevers zullen hen helpen te bepalen hoe hoog het loon is dat ze moeten uitkeren en in welke delen het is opgedeeld, en verder zullen ze zien waar ze staan betreffende de sociale zekerheidsbijdragen die ze verschuldigd zijn. Werknemers krijgen een applicatie om een overzicht te krijgen op hun carrière, en de fiscus (als externe partner in dit ecosysteem) kan informatie krijgen betreffende de inkomsten van de werknemers en de bedrijfsvoorheffing. De KSZ, ten slotte, kan waken over de toegang tot gegevens.</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><a href="/wp-content/uploads/2022/07/arbeidsmotor.png"><img fetchpriority="high" decoding="async" width="1024" height="583" src="/wp-content/uploads/2022/07/arbeidsmotor-1024x583.png" alt="" class="wp-image-17578" srcset="https://www.smalsresearch.be/wp-content/uploads/2022/07/arbeidsmotor-1024x583.png 1024w, https://www.smalsresearch.be/wp-content/uploads/2022/07/arbeidsmotor-300x171.png 300w, https://www.smalsresearch.be/wp-content/uploads/2022/07/arbeidsmotor-768x437.png 768w, https://www.smalsresearch.be/wp-content/uploads/2022/07/arbeidsmotor.png 1429w" sizes="(max-width: 1024px) 100vw, 1024px" /></a><figcaption>Figuur 1. Een ecosysteem van services en APIs rond het concept van arbeid in de Sociale Zekerheid, sterk gebruikmakend van Event Driven Architecture (fictief en niet exhaustief).</figcaption></figure></div>



<p class="justify-text wp-block-paragraph">In Fig. 1 zien we een collectie van IT services die dit business domein zouden kunnen ondersteunen (om de complexiteit te beperken zijn noch alle systemen, noch alle communicaties tussen de weergegeven systemen, opgenomen; het doorsturen van gegevens naar de fiscus is hier b.v. niet te zien).</p>



<p class="justify-text wp-block-paragraph">Links op de figuur staan een aantal APIs (altijd ondersteund door hun implementerende services) die vooral zullen worden gebruikt om gegevens binnen te krijgen van de werkgevers: alle data die verband houdt met arbeidsrelaties, geleverde prestaties en uitbetaalde salarissen (de Salary Suggest &amp; Payment API kan ook worden gebruikt om een suggestie te krijgen van het salaris dat moet worden betaald, berekend volgens de regels van de kunst).</p>



<p class="justify-text wp-block-paragraph">Meer naar het midden vinden we de systemen die deze data eerder zullen verwerken: deze staan los van de &#8220;input&#8221; systemen en krijgen hun data van deze laatste via events. We volgen hier dus op macroniveau <a href="/architecturale-evoluties-deel-2/" data-type="post" data-id="11475">het principe CQRS</a>, in die zin dat we het verzamelen van de gegevens (welke tot een &#8220;command&#8221; tot verwerking ervan zullen leiden) scheiden van de verwerking ervan (die zal leiden tot nieuwe, via &#8220;query&#8221; raadpleegbare gegevens).</p>



<p class="justify-text wp-block-paragraph">Het betreft ten eerste het consolideren van veranderingen in arbeidsrelaties, om zo altijd een up-to-date beeld te hebben van de huidige bestaande relaties, maar ook op de historiek. Ten tweede is er een berekeningsmodule voor salarissen, die ten gepasten tijde kan geactiveerd worden om de salarisvoorstellen te maken en uit te sturen. Het derde systeem is de WorkTime engine: deze krijgt een event binnen, telkens er gegevens binnenkomen betreffende prestaties, en zal deze consolideren tot een up-to-date view van wat er op dat moment gekend is betreffende deze gegevens (er kunnen bijvoorbeeld ook correcties van vorige data binnenkomen, die dan in rekening worden gebracht). Als voorlaatste zien we dan een systeem dat effectief uitbetaalde salarissen zal opvolgen en verwerken, en ten slotte hebben we nog de contribution engine, die op basis van heel wat gegevens uit de andere systemen en regelgeving, voorzien door een &#8220;Contribution &amp; Tax Rules System&#8221;, de contributies berekent die de werkgevers zullen moeten volstorten. Ook dit laatste kan een real-time optelsom laten zien van wat tot dan gekend is, maar evengoed kunnen we hier maandelijks of driemaandelijks een event laten genereren om het saldo voor die periode mee te delen.</p>



<p class="justify-text wp-block-paragraph">Rechts op de tekening zijn er dan de integraties met verdere backend systemen te zien: Work Task Control vangt events op om de werkprocessen van de medewerkers uit de Sociale Zekerheid te informeren, <a href="/app-for-government-communications/" data-type="post" data-id="17202">Human Notifications</a> kan naar events luisteren die via een ander communicatiekanaal aan mensen moeten worden meegedeeld, <a href="/nieuwe-versie-bpmn-standaard/" data-type="post" data-id="1307">Process Orchestrator</a> ontvangt en verstuurt events om op die manier iets complexere processen vooruit te helpen (b.v. trimestriële of maandelijkse afrekeningen), Realtime <a href="/big-data-analytics-whats-in-a-name/" data-type="post" data-id="7616">Analytics</a> kan live de <a href="/geavanceerd-event-driven-engineering/" data-type="post" data-id="9041">eventstroom</a> in de gaten houden en op basis van wat er binnenkomt intelligente beslissingen nemen en verdere signalen (events) uitsturen, en <a href="/data-centric-security-model/" data-type="post" data-id="9804">Audit Logging</a>, ten slotte, zal elk event ontvangen dat relevant is betreffende het loggen van de toegang tot, of wijziging aan gegevens (zelfs elk opvragen van data via één van de APIs kan een event veroorzaken dat dan kan worden gelogd als &#8220;entiteit X (iets of iemand) kreeg toegang tot een bepaald gegeven&#8221;). Dit laatste systeem kan in principe bij de KSZ staan, die onder andere dit soort opdracht hebben.</p>



<h3 class="wp-block-heading">Een Business event-verhaal doorheen dit ecosysteem</h3>



<p class="justify-text wp-block-paragraph">Laten we op zoek gaan naar een aantal Events die van belang zijn in dit business domein (de techniek &#8220;event storming&#8221; begint hier ook mee; we zullen hier echter al direct een wat technischer bril op zetten, en tegelijk het gegevensverkeer binnen het ecosysteem meevolgen). We doen dit via het voorbeeld van werknemer Willy C, die wordt aangenomen door het bedrijf Acme NV.</p>



<ul class="justify-text wp-block-list"><li>Eerst wordt Willy aangeworven als arbeider; hij krijgt een contract. Een aantal gegevens hiervan worden doorgegeven aan de Contracts API, en dit leidt tot een WorkRelationStartedEvent.</li><li>Dit event wordt opgevangen door de Relationship Engine, die de gegevens via API ter beschikking zal stellen, en door de Process Orchestrator, die een schedule zal starten om acties te ondernemen wanneer het tijd wordt om b.v. Willy zijn salaris te betalen.</li><li>Na een tijdje zal Willy beginnen werken en uren kloppen. WorkTimePerformed Events worden gegenereerd na gebruik van de WorkTime API. We laten in het midden hoe granulair deze events zijn. Technisch kan alles, wettelijk moet dit pas na een bepaalde termijn gebeurd zijn. Het kan echter ook nuttig zijn voor de werkgever om dit eerder door te sturen: degenen die b.v. elke dag, of na elke shift, de gewerkte uren doorgeven, hebben een betere &#8220;live view&#8221; bij het consulteren van hun gegevens via een dashboard, dan werkgevers die de gegevens pas doorgeven op het einde van de maand.</li><li>De WorkTimePerformed Events worden hoofdzakelijk verwerkt, en goed bewaard (d.m.v. Event Sourcing) door de WorkTime Engine. Deze zal alle gegevens netjes samenvoegen zodat men steeds een correct beeld heeft op hoeveel totale prestaties er reeds zijn geleverd door welke werknemer, voor welk bedrijf, gedurende eender welke periode. Dit wordt dan opnieuw via een API aangeboden, en aldus is dit dus een voorbeeld van <a href="/event-driven-apis/" data-type="post" data-id="16655">CQRS</a>: de gegevens komen binnen via de WorkTime API (en bijhorende service) en kunnen worden geraadpleegd via de Consolidated View API van de WorkTime Engine. Voor het gemak zullen de APIs echter via eenzelfde webadres worden geraadpleegd (de APIs kunnen apart worden ontwikkeld en onderhouden, om daarna samen te worden aangeboden door een API management oplossing).</li><li>Ook correcties in arbeidstijd (b.v. door laattijdig aanvragen van verlof) komen het ecosysteem binnen via WorkTimePerformed Events, waarin de correctie staat. De WorkTime Engine zal alle events netjes opslaan en met correcties rekening houden in het afgeleide datamodel.</li><li>In Willy&#8217;s contract staat dat Acme om de 2 weken zijn loon zal uitkeren, rekening houdend met de effectief gewerkte uren. De Payment Suggest Engine zal voorafgaand aan de uitbetaling ervan de huidige stand van zaken opvragen bij de WorkTime Engine (dit op commando van de Process Orchestrator). Op basis hiervan, en via de salarisgegevens verkregen van de Current Contracts API, kan de Payment Suggest Engine dan een brutoloon berekenen. In dit voorbeeld lijkt het heel eenvoudig, maar deze dienst zou kunnen worden uitgebreid met alle mogelijke vormen van loon (b.v. cafetariaplan, mobiliteitsvergoeding, maaltijdcheques, etc.). Wanneer de berekening klaar is wordt een BruteSalaryProposal Event verstuurd.</li><li>Dit laatste event wordt opgevangen door een dashboard voor de werkgever of zijn sociaal secretariaat. Er zal data in staan waarmee de werkgever zijn volledige &#8220;payslip&#8221; kan invullen: in dit vereenvoudigde voorbeeld kennen we dan het brutoloon, de werknemersbijdrage, het belastbaar loon, de bedrijfsvoorheffing en het nettoloon. Het loon kan dan door de werkgever worden uitbetaald: hoe dit precies gebeurt, laten we buiten beschouwing.</li><li>Uiteindelijk zal dus op de een of andere manier een betaling van het salaris gebeuren (al dan niet overeenkomend met de suggestie). Ook dit komt als data ons systeem binnen via een API die de werkgever of het sociaal secretariaat moet aanroepen: De Payment API (die in de tekening deel uitmaakt van de Salary Suggest &amp; Payment API) en gaat dan als een SalaryPayed Event naar de Salary Engine om de gegevens te verwerken. Een niet afgebeelde Banking Monitoring Service zal daarnaast monitoren wanneer er betalingen binnenkomen van de RSZ bijdragen, welke zullen resulteren in EmployeeContributionPayed Events, die ook naar diezelfde Engine kunnen worden gestuurd. Via de Consolidate Salary Info API kan men al deze gegevens historisch raadplegen.</li><li>Dashboard services voor de werkgever, zowel als voor de werknemer, kunnen eveneens van deze gegevens gebruik maken om ze te laten zien aan de eindgebruiker.</li><li>Na een kwartaal zal Acme zijn werkgeversbijdragen moeten betalen. Hiertoe zal de Contribution Engine in actie komen, in opdracht van de Process Orchestrator. Deze engine zal, door allerlei gegevens te raadplegen van een aantal APIs binnen het ecosysteem, de bijdrage berekenen en een event uitsturen. Op deze manier kan de informatie dan in het dashboard van de werkgever terechtkomen, maar ze wordt eveneens door Human Notifications opgevangen om een factuur naar de eBox te kunnen sturen. Daarnaast zal ook Work Task Control ingeschreven zijn op dit event, zodat processen en dossiers rond de werkgever Acme kunnen worden geüpdated.</li></ul>



<p class="justify-text wp-block-paragraph">We kunnen uiteraard blijven doorgaan met uit te leggen welke events er zijn en waarvoor deze allemaal nuttig kunnen zijn, maar we gaan ons beperken tot dit nog relatief eenvoudige voorbeeld. Deze manier van werken is eindeloos flexibel: elke service binnen dit ecosysteem kan, indien nodig, reageren op bepaalde gebeurtenissen en de nodige acties ondernemen, en dit kan dan zowel gaan om standaard business processen, als om ondersteunende zaken zoals audit logging en realtime analytics.</p>



<p class="justify-text wp-block-paragraph">We hebben hier een globaal overzicht geschetst van een ecosysteem van applicaties. Dit zegt natuurlijk nog niet in detail hoe elk van deze systemen intern zullen werken (en verder opgedeeld zijn in modules). <a href="/geavanceerd-event-driven-engineering/" data-type="post" data-id="9041">Event Sourcing</a> kan <a href="https://www.eventstore.com/blog/event-sourcing-and-cqrs">een logische keuze zijn om de CQRS die we hier voorzien te ondersteunen</a>, maar dit is niet noodzakelijk de beste keuze. Event Sourcing kan daarnaast b.v. ook van pas komen indien we &#8220;herspeelbaarheid&#8221; van wat er zich in een applicatie heeft afgespeeld willen bekomen. De meeste applicaties hebben echter voldoende lichte niet-functionele vereisten om een eenvoudiger intern ontwerp toe te laten. Wat we wel zien is dat een basis gebruik van EDA, ook zonder deze geavanceerde concepten, maar wel verdergaand dan enkel lege notificaties, het systeem erg gemakkelijk her- en uitbreidbaar maakt (met nieuwe events en nieuwe consumerende services die elkaar &#8220;kruisbestuiven&#8221; zonder van elkaar afhankelijk te worden).</p>



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



<p class="justify-text wp-block-paragraph">Event Driven Architecture en het gebruik van APIs vormen samen het bindweefsel van communicatie tussen diensten in een applicatie ecosysteem. Het fictieve voorbeeld in deze blog laat zien hoe ze elk in hun kracht staan: APIs voor de onmiddellijke ontsluiting en het beschikbaar stellen van bestaande gegevens (vaak zelfs als &#8220;authentieke&#8221; bron) en EDA voor het realtime en transparant consumeren van alle mogelijke informatie van zodra deze beschikbaar wordt, op een manier die de agiliteit en beschikbaarheid van het volledige ecosysteem sterk verhoogt. </p>


]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Ecosysteem Architectuur</title>
		<link>https://www.smalsresearch.be/ecosysteem-architectuur/</link>
		
		<dc:creator><![CDATA[Koen Vanderkimpen]]></dc:creator>
		<pubDate>Mon, 28 Feb 2022 16:22:49 +0000</pubDate>
				<category><![CDATA[[NL]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[architecture]]></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[mesh]]></category>
		<category><![CDATA[methodology]]></category>
		<category><![CDATA[microservices]]></category>
		<category><![CDATA[NewSQL]]></category>
		<category><![CDATA[rest]]></category>
		<category><![CDATA[Software architectures]]></category>
		<category><![CDATA[software design]]></category>
		<category><![CDATA[software engineering]]></category>
		<guid isPermaLink="false">/?p=16980</guid>

					<description><![CDATA[Bij het software bouwen, maken we meestal geen op zichzelf staande programma&#8217;s meer. We bouwen vandaag eerder Applicatie Ecosystemen. Wanneer we dus een stuk software schrijven, mogen we niet zomaar de ontwikkeling lokaal optimaliseren, maar moeten we ook continu rekening houden met het grotere geheel. In deze blog maken we een verkenning van een aantal [&#8230;]]]></description>
										<content:encoded><![CDATA[
<div class="wp-block-image"><figure class="alignleft size-full is-resized"><a href="/wp-content/uploads/2016/06/logomicro.png"><img decoding="async" src="/wp-content/uploads/2016/06/logomicro.png" alt="" class="wp-image-9733" width="163" height="147" srcset="https://www.smalsresearch.be/wp-content/uploads/2016/06/logomicro.png 679w, https://www.smalsresearch.be/wp-content/uploads/2016/06/logomicro-300x272.png 300w" sizes="(max-width: 163px) 100vw, 163px" /></a></figure></div>



<p class="justify-text wp-block-paragraph">Bij het software bouwen, maken we meestal geen op zichzelf staande programma&#8217;s meer. We bouwen vandaag eerder Applicatie Ecosystemen. Wanneer we dus een stuk software schrijven, mogen we niet zomaar de ontwikkeling lokaal optimaliseren, maar moeten we ook continu rekening houden met het grotere geheel. In deze blog maken we een verkenning van een aantal zaken waar we rekening mee moeten houden bij het bouwen van een ecosysteem, en van concrete principes die we kunnen toepassen bij het uitbouwen van een erbij passende modulaire architectuur.</p>



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



<h2 class="wp-block-heading" id="de-paradox-van-de-afhankelijkheid">De Paradox van de Afhankelijkheid</h2>



<p class="justify-text wp-block-paragraph">Er heerst grote waarde in zaken met elkaar verbinden, en in reeds bestaande zaken te <a href="/hergebruik-de-dos-en-donts/" data-type="post" data-id="13002">hergebruiken</a> bij het bouwen van nieuwe dingen. Gegevens, en ook de manier waarop ze worden verwerkt, ja, soms zelfs hele stukken van een applicatie, van één instelling, kunnen ook van pas komen bij een andere. En uiteraard geldt hetzelfde ook al binnen één en dezelfde instelling. Er is dus een meerwaarde te vinden door zaken met elkaar te verbinden en door zaken van elkaar te gaan hergebruiken. Dit is ook het hele opzet achter het <a href="https://www.ict-reuse.be/nl">ReUse verhaal binnen onze sector</a>. Connecties en communicaties tussen systemen creëren hergebruik, efficiëntie en business waarde.</p>



<p class="justify-text wp-block-paragraph">Maar wanneer we zaken verbinden, maken we ze van elkaar afhankelijk. Die afhankelijkheid heeft op technisch vlak vooral nadelen. Denk maar aan het onbeschikbaar zijn van een dienst waarvan andere diensten rechtstreeks afhangen; vaak worden deze laatste dan eveneens <a href="/99-9-availability-fundamenteel-anders/" data-type="post" data-id="1244">onbeschikbaar</a>. Maar ook semantisch maakt het de zaken moeilijker. We mogen niet zomaar puur lokaal nadenken over alle concepten die we in onze computerprogramma&#8217;s verwerken; nee, we moeten er rekening mee houden dat ze geïntegreerd of hergebruikt kunnen worden. We moeten ervoor proberen te zorgen dat de betekenis ervan voorbijgaat aan wat puur noodzakelijk is voor ons specifieke geval. Dat soort zaken maakt het ontwikkelen van software een stuk moeilijker. Dit niet doen is echter nog erger: de &#8220;technical debt&#8221; die ontstaat door teveel kortetermijn- en lokaal denken, zal dan op termijn alleen maar onbeheersbaarder worden.</p>



<p class="justify-text wp-block-paragraph">En dat is dus de paradox: de afhankelijkheid tussen de systemen binnen een applicatie ecosysteem creëert enorme business waarde, maar maakt de IT een stuk lastiger (en duurder).</p>



<h2 class="wp-block-heading" id="de-mesh-van-microservices">De &#8220;Mesh&#8221; Architectuur</h2>



<p class="justify-text wp-block-paragraph">Een goede architectuur kan echter soelaas brengen in dit verhaal, en consequent rekening houden met hergebruik kan uiteindelijk zelfs geld gaan besparen. Het gebruik van een <a href="/services-in-alle-maten-van-macro-naar-nano/" data-type="post" data-id="11111">Service Oriented Architecture (SOA)</a> is daarbij één van onze belangrijkste wapens om de afhankelijkheden in ons ecosysteem de baas te kunnen, met de <a href="/van-n-tier-naar-microservices/" data-type="post" data-id="9702">Microservices Architectuur</a> als ultieme voorbeeld. Dit zijn echter slechts voorbeeld technische implementaties van het belangrijke concept <em>Modulariteit </em>(dat men in principe zelfs binnenin een monolithisch systeem kan implementeren). Wat proberen we hiermee te bereiken?</p>



<ul class="justify-text wp-block-list"><li>Modules zijn zo onafhankelijk van elkaar als maar kan (maar maken toch van elkaar gebruik vanwege de waarde die dit heeft): ze zijn liefst &#8220;loosely coupled&#8221;: veranderingen in de werking of het ontwerp van één module hebben zo weinig mogelijk impact op de werking of het ontwerp van een andere. Dit laat toe om ze apart van elkaar te laten werken en ze te laten onderhouden door aparte teams, zonder dat er continu overleg of downtime moet zijn (in het geval van een monoliet verliest men wel dit downtime voordeel).</li><li>Modules zijn voldoende klein. Men volgt hier de <a href="https://en.wikipedia.org/wiki/Unix_philosophy">Unix filosofie &#8220;do one thing and do it well&#8221;</a>. In de praktijk wil dit zeggen dat modules gericht zijn op het aanbieden van één bepaalde business capabiliteit, die in principe apart kan worden gedeployed. Hoe men precies de context van een service afbakent, is één van de belangrijkste onderdelen van de <a href="https://en.wikipedia.org/wiki/Domain-driven_design">Domain Driven Design (DDD)</a> ontwikkelingsmethode.</li></ul>



<p class="justify-text wp-block-paragraph">Het tweede punt is niet te onderschatten en één van de moeilijkste zaken, reeds bij de business en functionele analyse en ook verderop in het ontwerp van software. In deze blog richten we ons echter op de aspecten van een groter ecosysteem, en daarom zullen we ons hier beperken tot de eerste vraag: </p>



<blockquote class="wp-block-quote has-text-align-center is-layout-flow wp-block-quote-is-layout-flow"><p>Hoe houden we onze modules zo goed mogelijk onafhankelijk, terwijl we ze toch laten communiceren?</p></blockquote>



<h2 class="wp-block-heading" id="een-aantal-helpende-principes">Een aantal helpende Principes</h2>



<p class="justify-text wp-block-paragraph">We gaan er vanaf hier van uit dat we onze modules verpakken in aparte services, en we zullen nu een aantal ontwerpprincipes overlopen die ons gaan helpen bij het uitbouwen van een ecosysteem architectuur waarin we een grote onafhankelijkheid, maar ook herbruikbaarheid, van onze services nastreven.</p>



<div class="wp-block-image justify-text"><figure class="alignright size-full is-resized"><a href="/wp-content/uploads/2022/02/usingAPI.png"><img decoding="async" src="/wp-content/uploads/2022/02/usingAPI.png" alt="" class="wp-image-17010" width="309" height="172" srcset="https://www.smalsresearch.be/wp-content/uploads/2022/02/usingAPI.png 497w, https://www.smalsresearch.be/wp-content/uploads/2022/02/usingAPI-300x167.png 300w" sizes="(max-width: 309px) 100vw, 309px" /></a><figcaption>Figuur 1: Twee APIs, telkens geïmplementeerd door een onderliggende service. De ene service gebruikt de API van de andere, en is dus enkel daarvan afhankelijk en niet van de onderliggende service. De pijl duidt hier de richting van de afhankelijkheid aan, maar de communicatie is steeds bidirectioneel (vraag-antwoord) en synchroon (men wacht op het antwoord).</figcaption></figure></div>



<p class="justify-text wp-block-paragraph"><strong>1.  Het gebruik van APIs</strong>. Dit principe is reeds goed gekend en vormt een basissteen van SOA: Een <a href="/data-centric-it-met-rest/" data-type="post" data-id="9535">service stelt zich open naar de buitenwereld toe via zijn API</a>, en deze API is dan ook het enige waarvan andere services afhankelijk kunnen zijn. Op die manier beperkt men dus de afhankelijkheid die andere zaken m.b.t. een service zullen hebben, tot wat strikt noodzakelijk is. Men is hier echter wel nog semantisch en syntactisch afhankelijk van de APIs van andere services die men wenst te gebruiken, en ook technisch afhankelijk van het online zijn van die andere services.</p>



<p class="justify-text wp-block-paragraph"><strong>2.  Het gebruik van Events</strong>. <a href="/event-driven-apis/" data-type="post" data-id="16655">Event Driven Architecture</a> is ook al oud, maar maakt meer recent furore dankzij de Reactive beweging. In plaats van (of naast) communicatie via een API, kan men de communicatie tussen services ook via het versturen van <a href="/het-event-als-leidend-voorwerp-in-software-engineering/" data-type="post" data-id="8942">events</a> laten gebeuren. Daar hoort bij dat een service die een event verstuurt, niet op voorhand weet welke andere services dit event zullen ontvangen. Services hebben hier enkel controle over de events die ze zelf versturen en dewelke ze zelf wensen te ontvangen. Het is duidelijk dat hier de onafhankelijkheid nog sterker is dan in het geval van APIs: men is niet langer rechtstreeks afhankelijk van de interface, noch van het online zijn, van een andere service. Men is enkel nog technisch afhankelijk van het online zijn van de <a href="/geavanceerd-event-driven-engineering/">Event Bus</a> (een middleware systeem dat men met grote redundantie kan opzetten), en semantisch afhankelijk van de definitie van de betrokken events (een niet te vermijden afhankelijkheid die wordt opgelegd door de business vereiste van het gebruik van de betreffende business capabiliteit die door het event mede wordt ondersteund).</p>



<div class="wp-block-image justify-text"><figure class="alignleft size-full is-resized"><a href="/wp-content/uploads/2022/02/usingCQRS-Events.png"><img loading="lazy" decoding="async" src="/wp-content/uploads/2022/02/usingCQRS-Events.png" alt="" class="wp-image-17035" width="302" height="285" srcset="https://www.smalsresearch.be/wp-content/uploads/2022/02/usingCQRS-Events.png 467w, https://www.smalsresearch.be/wp-content/uploads/2022/02/usingCQRS-Events-300x283.png 300w" sizes="auto, (max-width: 302px) 100vw, 302px" /></a><figcaption>Figuur 2: Twee services die gebruik maken van events om met elkaar te communiceren. De eerste biedt een command API aan, dewelke door een client wordt gebruikt om data in te dienen. Daarna stuurt deze een event naar de Event Bus, dat iets later ontvangen wordt door de tweede service. Deze zal het event gebruiken om zijn opvraagbare data te updaten, zodat deze daarna door een client kan worden opgevraagd. De pijlen van de events duiden effectief op éénrichtingscommunicatie, waarbij men niet wacht op antwoord (asynchroon).</figcaption></figure></div>



<p class="justify-text wp-block-paragraph"><strong>3.  CQRS</strong>. Wanneer we microservices bouwen die zo klein en onafhankelijk mogelijk zijn, betekent dit eigenlijk dat we een onderscheid moeten beginnen maken tussen services die data binnenkrijgen en/of (deels) verwerken, en services die daarop verder bouwen om informatie te verschaffen en vragen te kunnen beantwoorden. Typisch zullen dit verschillende business capabilities zijn, en dus een aparte service vereisen. Bovendien maken we de microservices liefst zo klein, dat er vaak data van meerdere microservices afkomstig, nodig zal zijn om bepaalde queries te beantwoorden, waardoor het sowieso minder vanzelfsprekend wordt om de queries te implementeren als onderdeel van één van die microservices; ook daardoor wordt het dus logischer om ze in een aparte dienst te deployen. Dit principe noemen we <a href="https://martinfowler.com/bliki/CQRS.html">Command Query Responsability Segregation (CQRS)</a>: we scheiden de ver-antwoordelijkheid voor het behandelen van commando&#8217;s (opnemen en verwerken van data) en die voor het beantwoorden van queries (teruggeven van, meestal verwerkte, data) in aparte services.</p>



<p class="justify-text wp-block-paragraph"><strong>4.  Sagas</strong>. Soms is het nodig dat in een applicatie zaken gebeuren die ofwel gezamenlijk slagen, ofwel gezamenlijk falen. Dit noemt men een transactie. Zoals reeds in een <a href="/eventual-consistency-1/" data-type="post" data-id="15544">eerdere blog</a> vermeld, is het nuttig om transacties binnen onze systemen te minimaliseren en goed na te denken op business niveau of ze echt wel nodig zijn. Desalniettemin zullen we ze toch niet geheel kunnen vermijden. Binnen één microservice is de implementatie hiervan doorgaans geen probleem: de onderliggende database zal dit ondersteunen volgens het tweefasig &#8220;commit&#8221; protocol (2 Phase Commit, 2PC). Wat we echter absoluut moeten vermijden, is om dit protocol toe te passen op meerdere services tegelijk <a href="/high-availability-wc-papier/" data-type="post" data-id="1368">in een gedistribueerde omgeving</a>. Om dan toch tegemoet te komen aan de nood aan gedistribueerde transacties, kunnen we sagas gebruiken. Een saga bestaat uit een reeks lokale transacties (binnen één service), waarbij elke service een event zal publiceren om de volgende transactie binnen de saga te triggeren in de volgende service die eraan meedoet. Indien één van de lokale transacties faalt, dan zal het verstuurde event verschillen van wat het normaal is, en dan volgen compenserende transacties in de services die reeds aan beurt kwamen, om de eerdere veranderingen terug ongedaan te maken. Men kan sagas op 2 manieren implementeren: de eerste is een <em>choreografie</em>, waarbij de services zelf weten wat ze wanneer moeten doen (op basis van de events die ze binnenkrijgen). De tweede optie is de <em>orchestratie</em>, waarbij één service zal optreden als de organisator van het gebeuren en de transactie stap voor stap opvolgt. De communicatie met participerende services kan hier ook met events plaatsvinden, maar eventueel ook via rechtstreekse API calls om de opeenvolgende opdrachten te geven (de antwoorden komen dan wel best via events terug binnen in de orchestrator, anders zondigt men tegen CQRS). Een voorbeeld van een saga (met choreografie) is het verhaal van de webshop in de <a href="/event-driven-apis/" data-type="post" data-id="16655">vorige blog over Event-Driven APIs</a>.</p>



<p class="justify-text wp-block-paragraph">Naast deze 4 principes zijn er nog een aantal secundaire ondersteunende zaken die we mogelijk kunnen doen binnen ons ecosysteem. Denk bijvoorbeeld aan het gebruik van <a href="/geavanceerd-event-driven-engineering/" data-type="post" data-id="9041">Event Sourcing</a>, of het inzetten van <a href="/newsql-getest-en-goedgekeurd/" data-type="post" data-id="13705">NewSQL databases</a> om een microservice met toestand goed te kunnen schalen. Deze zaken bespraken we reeds voldoende in vorige blogposts.</p>



<h2 class="wp-block-heading" id="besluit-even-wennen">Besluit: even Wennen</h2>



<p class="justify-text wp-block-paragraph">Een moderne architectuur voor een complex Applicatie Ecosysteem bestaat uit meer dan alleen maar APIs, en kan best stevig gebruik maken van de toegevoegde waarde die EDA en CQRS bieden. Wanneer men eerder traditionele architecturen gewend is, is de verhoogde complexiteit natuurlijk even wennen. De voordelen overwegen volgens ons echter op de nadelen van deze leercurve. Eens men deze zaken in de vingers heeft en een aantal keer heeft toegepast, zal men zowel op technisch vlak als op business vlak de pluspunten beginnen ondervinden.</p>



<p class="justify-text wp-block-paragraph">Om het allemaal een beetje behapbaarder te maken, zullen we in een volgende blog trachten deze principes verder te illustreren aan de hand van een voorbeeld applicatie ecosysteem.</p>





<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
		
		
			</item>
		<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 loading="lazy" 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="auto, (max-width: 179px) 100vw, 179px" /></a></figure></div>



<p class="justify-text wp-block-paragraph">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 wp-block-paragraph">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 wp-block-paragraph">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 wp-block-paragraph">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 wp-block-paragraph">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 wp-block-paragraph">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 loading="lazy" 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="auto, (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 wp-block-paragraph">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 wp-block-paragraph">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 wp-block-paragraph">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 wp-block-paragraph">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 wp-block-paragraph">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 wp-block-paragraph">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 wp-block-paragraph">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 wp-block-paragraph">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 class="wp-block-paragraph">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 loading="lazy" 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 wp-block-paragraph">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 wp-block-paragraph">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 wp-block-paragraph">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 wp-block-paragraph">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 wp-block-paragraph">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 wp-block-paragraph">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 wp-block-paragraph">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 wp-block-paragraph">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 wp-block-paragraph">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>API &#8211; the Smals story</title>
		<link>https://www.smalsresearch.be/api-the-smals-story/</link>
		
		<dc:creator><![CDATA[Koen Vanderkimpen]]></dc:creator>
		<pubDate>Sun, 06 Dec 2020 15:25:36 +0000</pubDate>
				<category><![CDATA[Presentations]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[reuse]]></category>
		<guid isPermaLink="false">https://www.smalsresearch.be/api-the-smals-story/</guid>

					<description><![CDATA[Slides from the Heliview conference &#8220;THE API EVENT&#8221; (dec. 2020) At Smals, our goal is to support a plethora of government agencies and to render administration more efficient. APIs play a central role in the exchange of data and the automation of business workflows, both within and between our different clients, and even with private [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"><strong>Slides from the Heliview conference &#8220;THE API EVENT&#8221; (dec. 2020)</strong></p>



<p class="wp-block-paragraph">At Smals, our goal is to support a plethora of government agencies and to render administration more efficient. APIs play a central role in the exchange of data and the automation of business workflows, both within and between our different clients, and even with private sector stakeholders. The goal is typically not to monetise our work, but to minimise public expenditure. For many years now, software reuse has been a central tenet to this end, and APIs its basic building blocks. In practice, however, reuse would be impossible without a disciplined API management. In this videotalk, we will demonstrate our journey towards the increased adoption and maturity of API governance among government stakeholders using a standards based, inclusive, and bottom-up approach, and give a brief overview of our current challenges.</p>



<h1 class="wp-block-heading">Recording</h1>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="Heliview Talk on APIs @Smals" width="500" height="281" src="https://www.youtube.com/embed/X4pQ4YcmpAA?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<h1 class="wp-block-heading">Presentation</h1>



<div data-wp-interactive="core/file" class="wp-block-file">
                <object data-wp-bind--hidden="!state.hasPdfPreview" hidden class="wp-block-file__embed" data="https://www.smalsresearch.be/wp-content/uploads/2020/12/Api-theSmalsStory.pdf" type="application/pdf" style="width:100%;height:600px" aria-label="Embed of Api-theSmalsStory."></object>
                <a id="wp-block-file--media-de136914-dbf1-47b4-a3a6-a2763968c998" href="https://www.smalsresearch.be/wp-content/uploads/2020/12/Api-theSmalsStory.pdf">Api-theSmalsStory</a><a href="https://www.smalsresearch.be/wp-content/uploads/2020/12/Api-theSmalsStory.pdf" class="wp-block-file__button wp-element-button" download aria-describedby="wp-block-file--media-de136914-dbf1-47b4-a3a6-a2763968c998">Download</a>
                </div>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>FastAPI &#8211; Python-based web framework</title>
		<link>https://www.smalsresearch.be/fastapi-python-based-web-framework/</link>
		
		<dc:creator><![CDATA[Katy Fokou]]></dc:creator>
		<pubDate>Tue, 31 Mar 2020 14:09:20 +0000</pubDate>
				<category><![CDATA[Quick reviews]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[FastAPI]]></category>
		<category><![CDATA[python]]></category>
		<guid isPermaLink="false">https://www.smalsresearch.be/fastapi-python-based-web-framework/</guid>

					<description><![CDATA[Outil de développement d&#8217;API web en Python. FastAPI est un framework intéressant pour la mise en production des applications développées en Python. Il présente de bonnes performances, est facile d’utilisation et bien documenté. Web API-ontwikkelingstool in Python. FastAPI is een interessant raamwerk voor het naar productie brengen van toepassingen ontwikkeld in Python. De tool werkt [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Outil de développement d&#8217;API web en Python. FastAPI est un framework intéressant pour la mise en production des applications développées en Python. Il présente de bonnes performances, est facile d’utilisation et bien documenté.</p>




<p class="wp-block-paragraph">Web API-ontwikkelingstool in Python. FastAPI is een interessant raamwerk voor het naar productie brengen van toepassingen ontwikkeld in Python. De tool werkt goed, is gemakkelijk te gebruiken en goed gedocumenteerd.</p>







            <div data-wp-interactive="core/file" class="wp-block-file">
                <object data-wp-bind--hidden="!state.hasPdfPreview" hidden class="wp-block-file__embed" data="https://www.smalsresearch.be/wp-content/uploads/2020/03/QR-FastAPI_2.pdf" type="application/pdf" style="width:100%;height:600px" aria-label="Embed of QR-FastAPI_2."></object>
                <a id="wp-block-file--media-c8346267-9097-4af3-8c0f-08a84e2534a6" href="https://www.smalsresearch.be/wp-content/uploads/2020/03/QR-FastAPI_2.pdf">QR-FastAPI_2</a><a href="https://www.smalsresearch.be/wp-content/uploads/2020/03/QR-FastAPI_2.pdf" class="wp-block-file__button wp-element-button" download aria-describedby="wp-block-file--media-c8346267-9097-4af3-8c0f-08a84e2534a6">Download</a>
                </div>
            ]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Hergebruik: Enkele Do&#8217;s en Don&#8217;ts&#8230;</title>
		<link>https://www.smalsresearch.be/hergebruik-de-dos-en-donts/</link>
		
		<dc:creator><![CDATA[Koen Vanderkimpen]]></dc:creator>
		<pubDate>Tue, 09 Apr 2019 09:45:52 +0000</pubDate>
				<category><![CDATA[[NL]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[architecture]]></category>
		<category><![CDATA[EDA]]></category>
		<category><![CDATA[methodology]]></category>
		<category><![CDATA[microservices]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[reuse]]></category>
		<category><![CDATA[software design]]></category>
		<category><![CDATA[software engineering]]></category>
		<guid isPermaLink="false">/?p=13002</guid>

					<description><![CDATA[Hergebruik: het gebruiken van een bestaand stuk software voor een nieuwe toepassing. Het lijkt een eenvoudig principe, maar er komt meer bij kijken dan je zou denken. Vooral wanneer je effectief een software artefact probeert te hergebruiken, creëer je al snel problemen. In deze blog gaan we wat dieper in op dit ogenschijnlijk simpele productiviteitsprincipe. [&#8230;]]]></description>
										<content:encoded><![CDATA[
<div class="wp-block-image"><figure class="alignleft is-resized"><img loading="lazy" decoding="async" src="/wp-content/uploads/2019/04/recycle.png" alt="" class="wp-image-13048" width="139" height="139"/></figure></div>



<p class="wp-block-paragraph" style="text-align:center"><em>Hergebruik: het gebruiken van een bestaand stuk software voor een nieuwe toepassing</em>.</p>



<p class="justify-text wp-block-paragraph">Het lijkt een eenvoudig principe, maar er komt meer bij kijken dan je zou denken. Vooral wanneer je effectief een software artefact probeert te hergebruiken, creëer je al snel problemen. In deze blog gaan we wat dieper in op dit ogenschijnlijk simpele productiviteitsprincipe.</p>



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



<p class="justify-text wp-block-paragraph">In mijn <a href="/services-in-alle-maten-van-macro-naar-nano/">blog over Microservices</a> van eind 2017 had ik het reeds kort over &#8220;re-use&#8221; als een antipatroon: dit ging vooral over hergebruik van code versus hergebruik van grotere componenten, zoals b.v. een API met een daarachterliggende microservice. Dit is een belangrijk voorbeeld van een breder principe: men moet goed weten op welk niveau van modulariteit men hergebruik wenst toe te passen.</p>



<p class="justify-text wp-block-paragraph">Verderop in deze blog gaan we dieper in op drie assen volgens welke we afwegingen zullen moeten maken om te besluiten in welke mate we hergebruik zullen nastreven en toepassen: Het niveau van granulariteit, het niveau van abstractie, en het niveau van functionaliteit.</p>



<p class="justify-text wp-block-paragraph">Daarnaast is het ook zo dat hergebruik maar kan op 2 voorwaarden: </p>



<ul class="justify-text wp-block-list"><li>Er bestaat een dienst, module, bibliotheek, &#8230; kortweg, een <em>software artefact</em>, dat herbruikbaar is.</li><li>We gebruiken een methodologie van software ontwikkeling die ons toelaat zaken te hergebruiken. Dit wil zeggen dat we enerzijds in staat zijn om de herbruikbare component te vinden en dat we er toegang toe hebben (en dat deze voldoende is gedocumenteerd), en we anderzijds een architectuur toepassen in de doeltoepassing die toelaat het bestaande artefact ook daadwerkelijk in te zetten.</li></ul>



<p class="justify-text wp-block-paragraph">In deze blog zullen we ons focussen op principes rond het bouwen van herbruikbare artefacten, en dus niet op het tweede aspect: het beheren en gebruiken van een patrimonium van herbruikbare software componenten. Verder gaan we ook niet dieper in op zaken die gerelateerd zijn aan hergebruik, zoals bv. het gebruiken van een gedeelde infrastructuur of het vinden van allerlei synergieën op ándere vlakken.</p>



<h2 class="wp-block-heading">Spanningsvelden bij het Beschouwen van Hergebruik</h2>



<p class="justify-text wp-block-paragraph">Zoals reeds aangehaald, zal mogelijk hergebruik van een software artefact afhangen van een aantal verschillende factoren. Telkens zal er een zeker spanningsveld heersen en zal er een middenweg moeten worden gevonden, die van project tot project of van artefact tot artefact kan verschillen.</p>



<h3 class="wp-block-heading">Niveau van Granulariteit</h3>



<p class="justify-text wp-block-paragraph">De grootte van het software artefact dat we willen hergebruiken, heeft een grote invloed op de mogelijke impact van het hergebruik: het is uiteraard voordeliger als we ineens een volledige, kant-en-klare service kunnen hergebruiken, die duizenden lijnen code encapsuleert, dan wanneer we enkel en alleen, op het niveau van de code, een bepaalde functie van een paar regels code kunnen hergebruiken. Nochtans hebben ze elk hun eigen kracht. Alle artefacten die we gebruiken moeten worden onderhouden; doorgaans is de kost die hiermee gepaard gaat evenredig met de grootte. Daarnaast is het zo, dat men een kleiner bouwblok, indien goed gekozen, vaker zal kunnen hergebruiken dan een groter.  <br>Het spreekt voor zich dat, hoe meer zaken men in één component verpakt, op hoe meer manieren deze component kan hergebruikt worden, maar tegelijk hoe omslachtiger het wordt om dit ook effectief te doen, omdat je teveel bagage meesleept. Beter is het om componenten zo klein mogelijk te houden, zodat ze één functionaliteit aanbieden, en deze kleine componenten dan op zoveel mogelijk plaatsen te gaan inzetten. Hier is echter weeral een spanningsveld: hoe meer componenten er bestaan, des te moeilijker wordt het om te <em>weten</em> dat ze bestaan (en om ze terug te vinden, dus). Kleine componenten bieden daarnaast echter nog vele andere voordelen (bv. microservices en agility, zoals beschreven in de blog <a href="/van-n-tier-naar-microservices/">daaromtrent</a>).</p>



<p class="justify-text wp-block-paragraph">Maar ook de context van het hergebruik speelt een rol bij overwegingen betreffende de grootte van de component: de functie van een paar regels code: zullen we deze enkel hergebruiken binnen eenzelfde project? Of als deel van een bibliotheek of raamwerk dat nog door vele andere projecten kan worden gebruikt? Hier zat de essentie van het verhaal bij microservices: men moet goed waken over de onfhankelijkheid van deze <a href="/architecturale-evoluties-deel-1/">wonderen van de moderne architectuur</a>: wanneer twee microservices gebruik maken van eenzelfde stuk code, heeft men in principe een afhankelijkheid gecreëerd tussen de beide.</p>



<h3 class="wp-block-heading">Mate van Abstractie</h3>



<p class="justify-text wp-block-paragraph">De mate van abstractie van software kan sterk variëren. Men kan een stuk software bouwen, nauwelijks parametriseerbaar, specifiek voor één welbepaalde taak. Dit zal nauwelijks herbruikbaar zijn. Maar indien men te ver probeert te gaan in de mate van abstractie die een stuk software aanbiedt, krijgt men uiteindelijk iets dat onbruikbaar is voor het oorspronkelijk doeleinde, omdat het zo generisch is, dat er nog heel veel werk bij komt kijken om het als dusdanig te parametriseren aan het doel waarvoor het werd ontworpen. Bovendien is software met een hoge mate van abstractie vaak ook moeilijker te begrijpen voor ontwikkelaars. Hier komt het er dus op neer een gouden middenweg te vinden: voldoende abstractie, zodat er binnen het business domein, en zoniet op een technisch vlak, nog enige kans bestaat op later hergebruik, maar niet teveel, zodat het artefact nog voldoende snel en eenvoudig inzetbaar is voor het oorspronkelijke doel. Daar komt dan wel nog een tweede spanningsveld roet in het eten gooien: dat van <em>kost versus mate van abstractie</em>. Een stuk software op een meer generische manier ontwerpen, vraagt doorgaans meer resources en een langere ontwikkeltijd dan om iets te bouwen voor één welbepaald doel. Men kan dus niet tegelijkertijd van een team van ontwikkelaars verwachten om zoveel mogelijk kostenbesparend te werken en enorm veel functionaliteit op te leveren tegen strakke deadlines, en tegelijkertijd geweldig herbruikbare (en onderhoudbare, robuuste, stabiele, &#8230; ) producten af te leveren.</p>



<h3 class="wp-block-heading">Hoogte in de functionele stack</h3>



<div class="wp-block-image justify-text"><figure class="alignright is-resized"><img loading="lazy" decoding="async" src="/wp-content/uploads/2019/04/functional-stack.png" alt="" class="wp-image-13062" width="301" height="454" srcset="https://www.smalsresearch.be/wp-content/uploads/2019/04/functional-stack.png 454w, https://www.smalsresearch.be/wp-content/uploads/2019/04/functional-stack-199x300.png 199w" sizes="auto, (max-width: 301px) 100vw, 301px" /><figcaption>In grote lijnen de &#8220;Functionele Stack&#8221;: hoger liggende componenten maken hier typisch enkel gebruik van lager liggende zaken. Hoe lager iets ligt, des te vaker het kandidaat is voor hergebruik.</figcaption></figure></div>



<p class="justify-text wp-block-paragraph">Een afgewerkte software, gebouwd voor een specifiek doel, met een eigen UI, is ongeveer wat als het hoogste in de &#8220;functionele stack&#8221; beschouwd kan worden. Dit is nauwelijks herbruikbaar, want purpose-built (met een grote uitzondering voor <a href="/de-saus-op-je-saas/">SaaS-software</a>). Lager in deze stack vindt men business-domein-specifieke bibliotheken en APIs. Deze zijn, binnen een bepaalde context, al een stuk herbruikbaarder (maar niet onmiddellijk functioneel inzetbaar zonder er iets vóór of rond te bouwen). Nog lager in de stack vindt men zaken die over domeinen heen herbruikbaar zijn: database software, cloud platformen, algemene software libraries en raamwerken. De laagste elementen in de stack, daar denken we zelfs al niet meer bij na wanneer we ze hergebruiken: het gaat om constructies die in bijna alle programmeertalen voorkomen (gegevensstructuren zoals arrays, ondersteuning voor reguliere expressies, etc.).</p>



<p class="justify-text wp-block-paragraph">Bedrijven die een sprong maken naar een <a href="/cloud-metaforen-elektriciteit-goud/">Cloud Platform</a>, maken typisch ook een sprong in herbruikbaarheid wat betreft het niveau in de functionele stack. Het gebruik van zaken als virtualisatie zorgt er bv. voor dat het veel sneller gaat om infrastructuur te koppelen aan een applicatie en dat deze koppeling ook bruikbaar is voor gelijkaardige applicaties (door de configuratie van zo&#8217;n machine te hergebruiken). Hogerop in de stack laat <a href="/productiviteitsverhoging-met-paas/">een platform</a> als <a href="/disruptie-in-de-cloud-stack-caas/">Kubernetes </a>en het gebruik van <a href="/de-vortex-van-enablers/">containers</a> toe dat men software images van over de hele wereld, en bovendien ook de eigen images, kan hergebruiken.</p>



<h2 class="wp-block-heading">Wat kan ons Helpen?</h2>



<p class="justify-text wp-block-paragraph">Kunnen we nu doorheen de anaylse van deze verschillende dimensies van hergebruik een rode draad trekken? Op welke manier zullen we het vaakst &#8220;de gulden middenweg&#8221; kunnen exploiteren? Hier speelt de gebruikte methodologie van software ontwikkeling een rol, en zeker ook de architectuur van zowel het mogelijks herbruikbare artefact en van de doeltoepassing. <a href="/architecturale-evoluties-deel-1/">Moderne architecturale principes</a> hebben hier vrijwel altijd een streepje voor, en de software industrie blijft hierin innoveren. Modulariteit is één van de sterkste drijvende krachten (ik verwijs opnieuw naar microservices, en nu misschien ook al naar <a href="/architecturale-evoluties-deel-2/">FPaaS</a>).</p>



<h3 class="wp-block-heading">Over MicroServices en APIs</h3>



<p class="justify-text wp-block-paragraph">Ik heb nu reeds tweemaal modulariteit en microservices aangehaald, maar daar moet wel een serieuze kanttekening bij worden gemaakt.</p>



<p class="wp-block-paragraph" style="text-align:center"><em>Microservices zijn OP ZICH NIET herbruikbaar</em>. <em>Het zijn de </em><strong><em>API</em></strong><em>s die men rond </em><strong><em>diensten</em></strong><em> bouwt, die herbruikbaar zijn door andere zaken.</em></p>



<p class="justify-text wp-block-paragraph">Van cruciaal belang is dus het ontwerp van deze APIs, rigoureus volgens standaarden (<a href="/data-centric-it-met-rest/">REST</a>) die nog eens zijn versterkt door een weldoordachte huisstijl (of beter nog, &#8220;sector-stijl&#8221;). Daarnaast moet men bij het ontwerpen van deze APIs goed rekening houden met de hierboven beschreven mate van abstractie en hoogte in de functionele stack. Bovendien moeten de APIs ook bekend zijn, en toegankelijk zijn. Het laatste vergt goed API management en sterke documentatie (en &#8220;kruisbestuifmensen&#8221; die kunnen fungeren als katalysatoren, overheen projecten), en ook een vlot proces van het ter beschikking stellen van APIs. Bij dit laatste spelen zaken zoals GDPR uiteraard een rol, maar spijtig genoeg ook af en toe politieke redenen (men wil soms te hard zijn &#8220;eigenaarschap&#8221; over bepaalde diensten of data behouden, en men belemmert om deze reden het hergebruik; of nog vindt men van zijn eigen systemen dat deze &#8220;te uniek&#8221; zouden zijn om in een hergebruik-kader te functioneren). Ten slotte is het ook van belang dat de systemen die schuilgaan achter de APIs, voldoende schaalbaar zijn, zodat ze bij toenemend gebruik nog kunnen volgen.</p>



<div class="wp-block-image justify-text"><figure class="alignleft"><img loading="lazy" decoding="async" width="381" height="273" src="/wp-content/uploads/2019/04/API.png" alt="" class="wp-image-13073" srcset="https://www.smalsresearch.be/wp-content/uploads/2019/04/API.png 381w, https://www.smalsresearch.be/wp-content/uploads/2019/04/API-300x215.png 300w" sizes="auto, (max-width: 381px) 100vw, 381px" /><figcaption>APIs: de herbruikbare interface waar zoveel zaken achter kunnen liggen. Hergebruik van werkende systemen dient zoveel mogelijk via RESTful APIs te gebeuren.<br></figcaption></figure></div>



<p class="justify-text wp-block-paragraph">Wanneer we over APIs spreken, spreken we hier dus over het hergebruik van (werkende) diensten. Dit is de belangrijkste vorm wat betreft zelfgemaakte software artefacten. <em>Het hergebruik van (eigen) code is iets totaal anders</em>. Dit kan zelfs contraproductief zijn: één van de krachtigste eigenschappen van microservices binnen een moderne architectuur, is hun onderlinge onafhankelijkheid: een microservice moet volledig op eigen benen kunnen staan (eigen werking, eigen logica, eigen data(-base), eigen (deeltje van de) infrastructuur, … De enige connectie met de buitenwereld is via Events (zie verder) en een API&nbsp;! ). Daarnaast maakt men ze zo klein mogelijk. Dit maakt ze enorm flexibel (&#8220;agile&#8221;): men kan ze apart van andere zaken onderhouden, aanpassen, vervangen (vandaar ook dat ze klein moeten zijn, &#8220;rip-and-replace&#8221; mag niet teveel kosten). Deze flexibiliteit maakt het mogelijk voor een softwarebedrijf om enorm snel op veranderende behoeften van de business in te spelen, doordat het geheel aan microservices continu en heel snel kan evolueren zonder volledig offline te gaan of langdurige aanpassingsprojecten en redeployments te moeten ondergaan. Welnu, vermits microserives zo onafhankelijk mogelijk van elkaar moeten zijn, kan het soms contraproductief zijn om zaken (niet alleen code maar bv. ook een bepaalde database) te gaan hergebruiken tussen meerdere microservices. Dergelijk hergebruik creëert afhankelijkheden en verplichtingen die de wendbaarheid van een microservice doen afnemen! Enkel zeer algemeen inzetbare bibliotheken (typisch 3rd party, vaak open source) vormen goede kandidaten om binnen een microservice herbruikt te worden; deze zitten typisch iets lager op de functionale stack dan het (business) domein waar de microservice rond is opgebouwd.</p>



<h3 class="wp-block-heading">Event Driven Architecture</h3>



<p class="justify-text wp-block-paragraph">In deze context komen we best ook terug op <a href="/het-event-als-leidend-voorwerp-in-software-engineering/">Event Driven Architecture</a>. Events zijn één van de datastructuren die men het dichtst bij de werkelijkheid kan doen aanleunen. Het gaat om een opdracht of aangifte of aanvraag die binnenkomt, een gebeurtenis uit de echte wereld die men modeleert, een bepaald gegeven dat beschikbaar wordt, een verandering van een reeds gekend gegeven, … <br>Deze zaken kunnen allemaal veel letterlijker gemapt worden op de werkelijkheid, dan wanneer ze eerst reeds binnen een bepaalde context (meestal de toepassing via dewelke ze het eerst worden ingevoerd) worden verwerkt. Hoe dichter deze informatie aanleunt bij de werkelijke wereld, hoe herbruikbaarder ze is voor andere zaken. Hetzij andere toepassingen die reeds bestaan en anders moeten wachten tot de data (soms in batch) wordt doorgestuurd of kan worden opgehaald via API, hetzij toepassingen die men pas zal bedenken doordat de events al bestaan (het zogenaamde kruisbestuiven binnen een applicatie ecosysteem).</p>



<p class="justify-text wp-block-paragraph">Zaak is dus van events heel goed te ontwerpen, vooral op het niveau van business events, en van deze meer en meer te gaan (her-)gebruiken. Naast mogelijk hergebruik heeft dit ook een mooie standaardisatie tot gevolg in de manier waarop applicaties (asynchroon) communiceren en data geprolifereerd wordt binnen een netwerk van toepassingen, en bovendien krijgt men de data op die manier veel sneller op alle plaatsen waar men ze nodig heeft, waardoor men op business niveau veel sneller kan reageren en flexibeler kan zijn. Goede documentatie van de events die men reeds heeft gedefiniëerd is dan uiteraard heel belangrijk. Ten slotte heeft men via events automatisch de volledige geschiedenis van de gegevens en niet alleen van de huidige toestand. Deze geschiedenis kan eveneens <strong>hergebruikt</strong> worden bij o.a. het aanpassen en testen van toepassingen, het ontwikkelen van nieuwe zaken, en <a href="/geavanceerd-event-driven-engineering/">verregaande analyse</a> (evt. ook voor het trainen van <a href="/ai-en-desinformatie/">een AI</a>)</p>



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



<p class="justify-text wp-block-paragraph">Wanneer men praat over herbruikbaarheid, is het belangrijk te verduidelijken of men het nu over code, dan wel APIs, diensten, componenten, infrastructuur of volledige software-pakketten gaat hebben. Samenvattend komt dit neer op het definiëren van de modulariteit, de mate van abstractie en de hoogte in de functionele stack van hetgeen men zou willen hergebruiken. Daarenboven moet men de afweging maken tussen de herbruikbaarheid van een artefact en de kostprijs om het te bouwen en onderhouden.</p>



<p class="justify-text wp-block-paragraph">Indien men met al deze aspecten rekening houdt, kan men besluiten dat hergebruik niet altijd alleszaligmakend is en dat het soms zelfs contraproductief kan zijn. Het belangrijkste hergebruik zal zich vaak ook niet op het niveau van de code bevinden.</p>



<p class="justify-text wp-block-paragraph">Wat applicatie architectuur in het algemeen betreft, maar dan nu specifiek toegepast op herbruikbaarheid, kunnen we daarnaast besluiten dat APIs (ondersteund door microservices, uitgerold op containers) en Event Driven Architecture een grote meerwaarde kunnen bieden.</p>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph"></p>



<h5 class="wp-block-heading">Verdere resources:</h5>



<ul class="wp-block-list"><li>Een boek over het hergebruik van software: <a href="https://vijaynarayanan.gitbooks.io/art-of-software-reuse/content/">https://vijaynarayanan.gitbooks.io/art-of-software-reuse/content/</a></li><li>Over de val van genericiteit en &#8216;super&#8217;-libraries, en de voordelen van modulariteit: <a href="https://josdejong.com/blog/2015/01/06/code-reuse/">http://josdejong.com/blog/2015/01/06/code-reuse/</a></li><li>Over de <strong>valstrikken</strong> van &#8220;code reuse&#8221; en hoe management dit echter meestal ziet: <a href="https://blog.ndepend.com/code-reuse-not-good-goal/">https://blog.ndepend.com/code-reuse-not-good-goal/</a></li><li>Over de <strong>kost</strong> van hergebruik: <a href="https://dzone.com/articles/economics-reuse">https://dzone.com/articles/economics-reuse</a></li><li>Bedenkingen bij extreme programming, een methodologie dewelke &#8220;design for reuse&#8221; eigenlijk afraadt: <a href="https://www.infoq.com/news/2009/04/agile-code-reuse">https://www.infoq.com/news/2009/04/agile-code-reuse</a></li><li>Talk van Rob Pike, met de quote &#8220;<strong><em>A little copying is better than a little dependency</em></strong>&#8221; (code reuse zorgt voor dependencies!): <a href="https://www.youtube.com/watch?v=PAAkCSZUG1c&amp;t=9m28s">https://www.youtube.com/watch?v=PAAkCSZUG1c&amp;t=9m28s</a></li><li>Martin Fowler over, o.a. , reuse: <a href="https://martinfowler.com/bliki/Seedwork.html">https://martinfowler.com/bliki/Seedwork.html</a></li><li>Methodologische tips voor hergebruik: <a href="https://www.infoq.com/articles/vijay-narayanan-software-reuse">https://www.infoq.com/articles/vijay-narayanan-software-reuse</a></li><li>Hoe reuse aanpakken op bedrijfsniveau: <a href="https://www.cs.cmu.edu/afs/cs/usr/ppinto/www/reuse.html">http://www.cs.cmu.edu/afs/cs/usr/ppinto/www/reuse.html</a></li></ul>


]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Architecturale Evoluties, deel 2</title>
		<link>https://www.smalsresearch.be/architecturale-evoluties-deel-2/</link>
		
		<dc:creator><![CDATA[Koen Vanderkimpen]]></dc:creator>
		<pubDate>Tue, 06 Nov 2018 12:16:29 +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[development]]></category>
		<category><![CDATA[EDA]]></category>
		<category><![CDATA[Event]]></category>
		<category><![CDATA[MASA]]></category>
		<category><![CDATA[methodology]]></category>
		<category><![CDATA[microservices]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[SOA]]></category>
		<category><![CDATA[software design]]></category>
		<category><![CDATA[software engineering]]></category>
		<guid isPermaLink="false">/?p=11475</guid>

					<description><![CDATA[Tijd om met een aantal exotische afkortingen te beginnen schermen, zoals EDA, CQRS en MASA. De moderne architectuur is soms ingewikkelder dan de oude, maar wie ze meester is, kan profiteren van een enorme flexibiliteit. Deze blog is het tweede deel van een reeks, waarin we een aantal mogelijkheden die ons worden geboden door goede architecturale [&#8230;]]]></description>
										<content:encoded><![CDATA[<p style="text-align: justify;"><a href="/wp-content/uploads/2018/05/architecture2.png"><img loading="lazy" decoding="async" class="alignleft wp-image-11754 size-full" src="/wp-content/uploads/2018/05/architecture2.png" alt="" width="146" height="141" /></a>Tijd om met een aantal exotische afkortingen te beginnen schermen, zoals EDA, CQRS en MASA. De moderne architectuur is soms ingewikkelder dan de oude, maar wie ze meester is, kan profiteren van een enorme flexibiliteit.</p>
<p><span id="more-11475"></span></p>
<p style="text-align: justify;">Deze blog is het tweede deel van een reeks, waarin we een aantal mogelijkheden die ons worden geboden door goede architecturale principes en technologieën, zullen toelichten. Een aantal van deze zaken werden ook reeds in vroegere blogs besproken, en de meeste worden ook nog eens samengevat in de blog &#8220;<a href="/de-vortex-van-enablers/">Vortex van Enablers</a>&#8220;. De eerste blog van deze reeks beschouwde de gedeeltes van een applicatie-architectuur die de gebruikersinterface en externe clients ondersteunen: <a href="/architecturale-evoluties-deel-1/">Architecturale Evoluties, deel 1</a>.</p>
<p style="text-align: justify;">In dit deel duiken we dieper in de applicatie, en zullen we beschouwen hoe we de interacties met onze applicatie verder kunnen afhandelen. Interacties kunnen via allerlei wegen onze applicatie binnenkomen (b.v. aanvragen vanuit een GUI, requests via een extern-gerichte API, maar ook interne, geplande acties die op bepaalde momenten worden gestart). Voor de binnenste onderdelen van de architectuur is dit onderscheid echter van minder belang. Wel belangrijk is of het gaat om een vraag om output te genereren (dit zullen we een <strong>query</strong> noemen), of dat het eerder gaat om nieuwe input (vaak een <strong>command</strong> genoemd, maar dit komt eigenlijk overeen met een <a href="/het-event-als-leidend-voorwerp-in-software-engineering/"><strong>Event</strong></a>). Soms zijn deze beide vormen gecombineerd (er is nieuwe input, die op zich al tot nieuwe output moet leiden), maar vaak is het mogelijk om deze aspecten in de verwerking van de interactie voldoende gescheiden te houden.</p>
<h1 style="text-align: justify;">De Moderne Architectuur, Deel 2</h1>
<p style="text-align: justify;">In het eerste deel van deze blogreeks beschreven we reeds hoe alle externe interactie met onze applicatie kon worden herleid tot het oproepen van Restful APIs, die we konden aanbieden via één of meerdere <a href="/van-n-tier-naar-microservices/">microservices</a>. In dit tweede deel kunnen we ons daardoor volledig focussen op de interne werking van een collectie microservices, die samen een applicatie (of een groep van applicaties) ondersteunen. Dit is een radicale breuk met de meer traditionele 3-tier of n-tier architecturen van weleer. Gartner heeft deze nieuwe trend de naam &#8220;MASA&#8221; gegeven, wat staat voor <a href="https://web.archive.org/web/20190410162606/https://www.gartner.com/doc/3645328/top--strategic-technology-trends">Mesh App and Service Architecture</a>: een zeer modulair and flexibel aanpasbaar netwerk van oplossingen die de dynamisch veranderde behoeften vanuit de business snel kunnen opvangen.</p>
<p style="text-align: justify;">Eén opmerking die we voor de volledigheid nog moeten maken, is dat het in deel 1 om interactie met écht externe zaken ging, zoals de clients en 3rd party applicaties. Dit leidt er doorgaans toe dat we sterk gestandaardiseerde interactievormen via het web zullen gebruiken (waardoor vrijwel enkel REST APIs kunnen worden beschouwd). Integratie binnen het eigen ecosysteem kan echter, naast APIs, ook nog via de <strong>Event Bus</strong> gebeuren, die op zich gebouwd is bovenop het principe van asynchrone uitwisseling van berichten tussen de services. Dit duale principe (synchroon REST kanaal en asynchroon event kanaal, ook reeds toegelicht in de <a href="/data-centric-it-met-rest/">blog over Data Centric IT</a>) moet volstaan om alle communicatie tussen de verschillende onderdelen van een applicatie (of ecosysteem) in goede banen te leiden. Op zijn beurt laat deze ogenschijnlijke beperking toe om de technische kant van het verhaal te standaardiseren.</p>
<ul>
<li>
<h2>Een woordje over de MASA</h2>
</li>
</ul>
<p><figure id="attachment_12263" aria-describedby="caption-attachment-12263" style="width: 300px" class="wp-caption alignright"><a href="/wp-content/uploads/2018/11/mesh.png"><img loading="lazy" decoding="async" class="wp-image-12263 size-medium" src="/wp-content/uploads/2018/11/mesh-300x294.png" alt="" width="300" height="294" srcset="https://www.smalsresearch.be/wp-content/uploads/2018/11/mesh-300x294.png 300w, https://www.smalsresearch.be/wp-content/uploads/2018/11/mesh.png 693w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><figcaption id="caption-attachment-12263" class="wp-caption-text">Fig. 1: Mesh App &amp; Service Architecture</figcaption></figure></p>
<p style="text-align: justify;">Zoals reeds gezegd, staat MASA voor &#8220;Mesh App &amp; Service Architecture&#8221;. Het woordje &#8220;mesh&#8221; (= een fijnmazig net) betekent dat de huidige architectuur uit vele aparte onderdelen zal bestaan, die via steeds veranderende configuraties met elkaar communiceren. Het model dat we in deze blogreeks uit de doeken doen, namelijk een ecosysteem van samenwerkende microservices, communicerend via <a href="/het-event-als-leidend-voorwerp-in-software-engineering/">Event Bus</a> en RESTful APIs, is daarbij eigenlijk nog een eenvoudige versie. In de praktijk zal men evolueren naar ingewikkelder patronen, waarbij in deze mesh ook legacy toepassingen zullen verweven zitten, alsook zaken die in de <a href="/disruptie-in-de-cloud-stack-caas/">Cloud</a> draaien i.p.v. op het lokale netwerk, afzonderlijke functies die volgens het zogenaamde &#8220;<a href="https://en.wikipedia.org/wiki/Serverless_computing">Serverless</a>&#8221; principe werken, en zelfs <a href="/er-zit-een-hacker-in-mijn-diepvries/">IoT</a> devices. Dit soort gemengde architectuur ontstaat doordat vele organisaties nu eenmaal legacy toepassingen draaiende moeten houden, en doordat er een grote heterogeniteit aan projecten te volbrengen is, hetgeen er voor zorgt dat er vaak ook verschillende keuzes gemaakt worden wat betreft de onderliggende platformen. In zo&#8217;n geval is het echter ook belangrijk (of zelfs nog belangrijker) dat men tracht de communicatiepatronen tussen al deze verschillende zaken te standaardiseren, om aldus de compatibiliteit en integreerbaarheid te maximaliseren.</p>
<ul>
<li>
<h2>De Duale Service Interface: CQRS</h2>
</li>
</ul>
<p style="text-align: justify;">In de introductie vermeldden we reeds het onderscheid tussen commando&#8217;s en queries. <a href="https://martinfowler.com/bliki/CQRS.html">CQRS</a> staat voor <a href="https://docs.microsoft.com/en-us/azure/architecture/patterns/cqrs">Command Query Responsability Segregation</a>, wat zoveel betekent als &#8220;scheiding van de verantwoordelijkheid voor het afhandelen van commando&#8217;s en queries&#8221;. In de praktijk wil dat zeggen dat we zullen proberen om een logische scheiding te krijgen tussen de systemen die commando&#8217;s verwerken en tussen degene die vragen beatwoorden. Dit is schematisch weergegeven in onderstaande Fig. 2.</p>
<p><figure id="attachment_12196" aria-describedby="caption-attachment-12196" style="width: 688px" class="wp-caption alignnone"><a href="/wp-content/uploads/2018/09/highlevelbackend.png"><img loading="lazy" decoding="async" class="wp-image-12196 size-large" src="/wp-content/uploads/2018/09/highlevelbackend-1024x372.png" alt="" width="688" height="250" srcset="https://www.smalsresearch.be/wp-content/uploads/2018/09/highlevelbackend-1024x372.png 1024w, https://www.smalsresearch.be/wp-content/uploads/2018/09/highlevelbackend-300x109.png 300w, https://www.smalsresearch.be/wp-content/uploads/2018/09/highlevelbackend-768x279.png 768w, https://www.smalsresearch.be/wp-content/uploads/2018/09/highlevelbackend.png 1081w" sizes="auto, (max-width: 688px) 100vw, 688px" /></a><figcaption id="caption-attachment-12196" class="wp-caption-text">Fig. 2: Schematisch overzicht van de backend systemen: aanvragen worden opgesplitst in queries en commands, die elk hun eigen pad vervolgen richting een groep backend (micro-)services. Deze zullen informatie in de vorm van inkomende events verwerken tot hapklare zaken die later door queries kunnen worden opgevraagd.</figcaption></figure></p>
<p style="text-align: justify;">Queries kunnen doorgaans rechtstreeks door een API worden beantwoord, al dan niet door de vraag, mogelijks in stukjes gekapt, aan een verdere API door te geven. Uiteindelijk zullen het de onderliggende (micro-)services zijn die het echte werk doen van opzoeken in databases en eventueel nog een paar bewerkingen uitvoeren om het antwoord in de gevraagde vorm te krijgen. Wat betreft de interactie tussen verschillende services, hoeft hier dus niet te worden afgeweken van RESTful synchrone communicatie.</p>
<p style="text-align: justify;">Het ligt iets anders voor commando&#8217;s. Wanneer we volledig het paradigma van <a href="/geavanceerd-event-driven-engineering/">Event Sourcing</a> toepassen, zullen we een commando steeds omzetten in een gebeurtenis (b.v. het commando &#8220;<em>bestel één <a href="/blockchain-vs-event-driven-architecture/">blockchain</a> boek</em>&#8221; wordt dan het <span style="text-decoration: underline;">event</span> &#8220;<em>bestelling van één <a href="https://www.larcier-intersentia.com/nl/blockchain-smart-contracts-9782807909380.html">blockchain boek</a> geplaatst</em>&#8220;). Deze omzetting zal door een eerste laag van services worden gedaan, speciaal gebouwd voor het opvangen van dergelijke commando&#8217;s vanuit de client side.</p>
<p style="text-align: justify;">Het commando kan dan verder worden afgehandeld als een typisch event: het komt op de Event Bus terecht en alle geïnteresseerde diensten zullen het asynchroon ontvangen en kunnen behandelen (één backend service zal b.v. de inventory aanpassen; een andere zet het verpakken op gang en nog een andere verwittigt de koerierdienst). In elk geval is het creëren van afgeleide informatie (b.v. de hoeveelheid in stock) een verantwoordelijkheid van een microservice die daarvoor zijn eigen database zal hebben.</p>
<p style="text-align: justify;">Wanneer nu later een vraag toekomt die betrekking heeft op informatie beïnvloed door een eerder commando, dan zal deze geforward worden naar de microservices die deze up-to-date informatie controleren (b.v. de vraag &#8220;<em>hoeveel van die blockchain boeken zijn er nog in voorraad</em>&#8221; komt uiteindeljik terecht bij de service voor de inventory). Vermits events asynchroon werken kan het soms zijn dat een vraag nét te snel komt en de informatie dus niet volledig up-to-date is (meestal is het echter een kwestie van enkele seconden). Vandaar dat het bij dit soort architecturen aangewezen is de principes van &#8220;<a href="https://en.wikipedia.org/wiki/Eventual_consistency">eventual consistency</a>&#8221; goed toe te passen, en zelfs door te trekken tot op business niveau.</p>
<p><figure id="attachment_12198" aria-describedby="caption-attachment-12198" style="width: 1050px" class="wp-caption aligncenter"><a href="/wp-content/uploads/2018/09/complexexample.png"><img loading="lazy" decoding="async" class="size-full wp-image-12198" src="/wp-content/uploads/2018/09/complexexample.png" alt="" width="1050" height="543" srcset="https://www.smalsresearch.be/wp-content/uploads/2018/09/complexexample.png 1050w, https://www.smalsresearch.be/wp-content/uploads/2018/09/complexexample-300x155.png 300w, https://www.smalsresearch.be/wp-content/uploads/2018/09/complexexample-768x397.png 768w, https://www.smalsresearch.be/wp-content/uploads/2018/09/complexexample-1024x530.png 1024w" sizes="auto, (max-width: 1050px) 100vw, 1050px" /></a><figcaption id="caption-attachment-12198" class="wp-caption-text">Fig. 3: Een iets gedetailleerder voorbeeld. Voor de uitleg verwijzen we naar de tekst.</figcaption></figure></p>
<p style="text-align: justify;">Bovenstaande Figuur 3 toont een iets gedetailleerder voorbeeld. In de figuur zien we dat er achter de App API, 2 Command APIs en 1 Query API schuilgaan. Daarnaast zien we een door meerdere zaken gebruikte Event Bus, waarvan alle events ook in een centrale event store terecht komen. Sommige backend microservices communiceren rechtsreeks met de bus en spelen dus kort op de bal; daarnaast is er een service die vooral gebruik maakt van de event store en die dus meer zaken kan doen met historische events (b.v. <a href="/big-data-analytics-whats-in-a-name/">analytics</a>). Verder zien we dat er een legacy systeem communiceert via het event kanaal en dat een aantal services APIs aanbieden, sommige zelfs rechstreeks aan externe systemen. Er is een kort scenario uitgewerkt in de tekening:</p>
<ol>
<li style="text-align: justify;">Een update wordt gevraagd, wat zich vertaalt in een reeks van events die door een aantal services verwerkt worden. Het event komt uiteraard in de event store terecht.</li>
<li style="text-align: justify;">Een andere update zorgt er uiteindelijk voor dat er events ontstaan die aanpassingen doen gebeuren aan een database van afgeleide informatie, behorende tot een bepaalde microservice.</li>
<li style="text-align: justify;">Een query vraagt informatie op via API, en uiteindelijk wordt een API van de microservice van stap 2 aangeroepen; deze zal dus van de geüpdate informatie uit de database van stap 2 gebruik maken.</li>
<li style="text-align: justify;">Een andere query doet een iets diepgaandere vraag. Via verschillende calls tussen deelnemende services, wordt er uiteindelijk informatie opgevraagd uit de event store.</li>
</ol>
<p><figure id="attachment_12194" aria-describedby="caption-attachment-12194" style="width: 206px" class="wp-caption alignleft"><a href="/wp-content/uploads/2018/09/GoodClientUpdate.png"><img loading="lazy" decoding="async" class="wp-image-12194" src="/wp-content/uploads/2018/09/GoodClientUpdate-171x300.png" alt="" width="206" height="362" srcset="https://www.smalsresearch.be/wp-content/uploads/2018/09/GoodClientUpdate-171x300.png 171w, https://www.smalsresearch.be/wp-content/uploads/2018/09/GoodClientUpdate.png 486w" sizes="auto, (max-width: 206px) 100vw, 206px" /></a><figcaption id="caption-attachment-12194" class="wp-caption-text">Fig. 4: Een goed gebouwde client van het systeem kan worden geüpdated bij binnenkomende events aan de serverkant.</figcaption></figure></p>
<p style="text-align: justify;">Dit verhaal is, vanwege het gebruik van Events, voor een deel asynchroon. Sommige cliënts zullen echter zo synchroon mogelijk moeten worden geüpdated. Hoe kunnen zij vlot op de hoogte worden gebracht van de meest recente informatie? Ter herinnering: in een volledig synchrone wereld zal een cliënt als antwoord op een commando ook onmiddellijk de nieuwe toestand meekrijgen. Met de nieuwe architectuur moet de cliënt echter &#8220;gissen&#8221; na hoeveel tijd hij een query naar de server moet sturen, om er zeker van te zijn dat het effect van zijn laatste commando in rekening is gebracht. Dit giswerk kan men echter vermijden. Sowieso is het niet zo efficiënt om ervan uit te gaan dat het altijd de cliënt is die alle communicatie moet initiëren. We zullen er dus voor zorgen dat ook de server dit initiatief kan nemen. Als gevolg van een binnenkomend Event moet ook de server in staat zijn om op dat moment een bericht te sturen naar de client. Er zijn ondertussen verschillende manieren waarop een cliënt aan een server zijn interesse kan laten blijken in het krijgen van callbacks wanneer up-to-date informatie beschikbaar is, en er zijn zelfs al full-duplex communicatiemogelijkheden voor applicaties op het web. (<a href="https://en.wikipedia.org/wiki/WebSocket">WebSocket</a> is een vrij modern voorbeeld).</p>
<p style="text-align: justify;">Indien het niet mogelijk is de client op een manier te bouwen dat deze door de server kan worden gecontacteerd, en het is evenwel belangrijk dat de client zo snel mogelijk up-to-date informatie krijgt, dan is er nog een noodoplossing mogelijk. We kunnen alsnog een API voorzien die toelaat dat men via één enkele request zowel een update doet als de nieuwe informatie meekrijgt in het antwoord. Desalniettemin zullen we het CQRS patroon voor het grootste gedeelte respecteren in de backend. Het volstaat om de API zo te bouwen, dat hij de request zelf opdeelt in een commando en één of meerdere queries. De microservice die achter deze API schuilgaat, zal dan eerst het event lanceren om het commando uit te laten voeren, en zal vervolgens wachten tot er genotificeerd komt via de juiste events, die de afhandeling van dit commando aangeven. Daarna kan de service overgaan tot het lanceren van de queries en dan vervolgens zelf antwoorden op de vraag van de client. Dit patroon zorgt er wel voor dat soms de client wat langer (synchroon) zal moeten wachten op zijn antwoord, omdat het asynchrone gedeelte volledig aan de serverkant moet worden afgehandeld.</p>
<h2>Conclusie</h2>
<p style="text-align: justify;">We zien hoe een moderne architectuur ervoor zorgt dat men een applicatie (of groep applicaties) kan opdelen in zo klein mogelijke microservices, elk met hun eigen verantwoordelijkheid. Deze zijn efficient te onderhouden en ook vervangbaar, wat het gehele systeem een ongeziene flexibiliteit geeft om zich aan te kunnen passen aan zowel veranderende functionaliteit als aan veranderingen aan de infrastructuur of de benodigde capaciteit. Daarnaast hebben we een gestandaardiseerde manier van communiceren toegelicht, die ervoor zorgt dat de mesh van apps, de &#8220;MASA&#8221;, continu kan veranderen en groeien, doordat men alle onderdelen gemakkelijk via het netwerk met elkaar kan laten communiceren. Ten slotte konden we ook zien hoe CQRS hiervan gebruik maakt om een nette afhandeling van alle mogelijke vragen te voorzien, gebruik makende van Events, die ook de historiek en traceerbaarheid van het systeem garanderen, van client tot backend.</p>
<p style="text-align: justify;">
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Architecturale Evoluties, deel 1</title>
		<link>https://www.smalsresearch.be/architecturale-evoluties-deel-1/</link>
		
		<dc:creator><![CDATA[Koen Vanderkimpen]]></dc:creator>
		<pubDate>Wed, 21 Mar 2018 13:35:54 +0000</pubDate>
				<category><![CDATA[[NL]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[cloud computing]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[EDA]]></category>
		<category><![CDATA[microservices]]></category>
		<category><![CDATA[rest]]></category>
		<category><![CDATA[software design]]></category>
		<category><![CDATA[software engineering]]></category>
		<guid isPermaLink="false">/?p=11434</guid>

					<description><![CDATA[Vroeger was het simpel: je had front end, back end, en database. En toch is dit verre van optimaal. Hoe ziet een architectuur eruit die gebruik maakt van moderne principes en technologieën? Er zijn heel wat mogelijkheden te overwegen wanneer men de architectuur van een applicatie bepaalt. Dit is nog eens extra het geval wanneer [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><a href="/wp-content/uploads/2018/03/architecture.png"><img loading="lazy" decoding="async" class="alignleft size-full wp-image-11480" src="/wp-content/uploads/2018/03/architecture.png" alt="" width="146" height="141" /></a>Vroeger was het simpel: je had front end, back end, en database. En toch is dit verre van optimaal. Hoe ziet een architectuur eruit die gebruik maakt van moderne principes en technologieën?</p>
<p><span id="more-11434"></span></p>
<p style="text-align: justify;">Er zijn heel wat mogelijkheden te overwegen wanneer men de architectuur van een applicatie bepaalt. Dit is nog eens extra het geval wanneer het een applicatie betreft die niet alleen staat, maar op allerlei manieren zal moeten integreren met andere applicaties en diensten, zowel binnen als buiten de eigen organisatie. In een tweedelige blogreeks bespreken we een aantal mogelijkheden die ons worden geboden door een aantal architecturale principes en technologieën, die ik reeds eerder samenvatte als de &#8220;<a href="/de-vortex-van-enablers/">Vortex van Enablers</a>&#8220;.</p>
<p style="text-align: justify;">In dit eerste deel bespreken we de bovenste regionen van de moderne applicatie architectuur. Alles wat met de interactie met de buitenwereld te maken heeft, zoals clients en 3rd party systemen (die vaak gewoon ook als clients kunnen worden beschouwd). In de volgende blog zal het dan gaan over de meer interne systemen. We beginnen hier met een terugblik op de traditionele 3-tier architectuur.</p>
<h1>De 3-tier Architectuur</h1>
<p><figure id="attachment_11442" aria-describedby="caption-attachment-11442" style="width: 129px" class="wp-caption alignleft"><a href="/wp-content/uploads/2018/03/3-tier-arch-highlevel.png"><img loading="lazy" decoding="async" class="wp-image-11442 size-medium" src="/wp-content/uploads/2018/03/3-tier-arch-highlevel-129x300.png" alt="" width="129" height="300" srcset="https://www.smalsresearch.be/wp-content/uploads/2018/03/3-tier-arch-highlevel-129x300.png 129w, https://www.smalsresearch.be/wp-content/uploads/2018/03/3-tier-arch-highlevel.png 285w" sizes="auto, (max-width: 129px) 100vw, 129px" /></a><figcaption id="caption-attachment-11442" class="wp-caption-text">Fig. 1: De 3-tier Architectuur</figcaption></figure></p>
<p style="text-align: justify;">De 3-tier architectuur kennen we ondertussen stilaan. De verschillende &#8220;tiers&#8221; die er kunnen bestaan, en de geschiedenis ervan, werden reeds uitvoerig beschreven in de blog <a href="/van-n-tier-naar-microservices/">Van N-tier naar Microservices</a>.</p>
<p style="text-align: justify;">Deze stilaan verouderde architectuur kent een aantal problemen, niet in het minst qua herbruikbaarheid en integratiemogelijkheden. Zo komt men vaak in de problemen wanneer men nieuwe manieren van interactie wil toevoegen, zoals een <a href="/de-mobiele-burger-zowel-consument-als-leverancier-van-data-apps/">mobiele app</a>, of, waarom niet, een <a href="/conversationele-interfaces/">conversational interface</a>. Een ander euvel is integratie: wanneer de <a href="/data-centric-it-met-rest/">data</a> nodig is voor andere toepassingen, blijkt de op zichzelf ontworpen 3-tier applicatie vaak te incompatibel, en is men gedwongen de integratie via de data te doen. Dit door ofwel de database te koppelen aan meerdere applicaties via opengestelde fluxen, of d.m.v. het creëren van een duplicaat van de data, dat men dan om de zoveel tijd zal moeten updaten via één of ander <a href="https://en.wikipedia.org/wiki/Extract,_transform,_load">ETL </a>mechanisme. Een groot probleem is daarbij ook vaak dat de data semantisch sterk is gekoppeld aan de specifieke applicatiecontext.</p>
<p><figure id="attachment_11446" aria-describedby="caption-attachment-11446" style="width: 150px" class="wp-caption alignright"><a href="/wp-content/uploads/2018/03/3-tier-api.png"><img loading="lazy" decoding="async" class="wp-image-11446" src="/wp-content/uploads/2018/03/3-tier-api-230x300.png" alt="" width="150" height="195" srcset="https://www.smalsresearch.be/wp-content/uploads/2018/03/3-tier-api-230x300.png 230w, https://www.smalsresearch.be/wp-content/uploads/2018/03/3-tier-api.png 271w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a><figcaption id="caption-attachment-11446" class="wp-caption-text">Fig. 2: 3-tier Front End, ontsloten door API.</figcaption></figure></p>
<p style="text-align: justify;">Verderop in deze blogreeks gaan we bekijken hoe het beter kan, met een modernere architectuur. Uiteraard is dit echter geen zwart-wit verhaal. De beschreven voorbeeldoplossing zal op een behoorlijk verregaande manier verschillen van de traditionele oplossing, maar er zijn uiteraard ook allerlei tussenoplossingen en middenweg-scenario&#8217;s te bedenken. Een zeer eenvoudig voorbeeld is bijvoorbeeld het koppelen van de verschillende tiers binnen zo&#8217;n verouderde architectuur via RESTful APIs (zie Fig. 2). Dit is een vaak broodnodige upgrade, die nu reeds op veel plaatsen wordt toegepast. Het is een goed begin, maar meestal nog onvoldoende om de flexibiliteit en herbruikbaarheid te bereiken die we beogen met een echte modernisering.</p>
<h1 style="text-align: justify;">De Moderne Architectuur, Deel 1</h1>
<p style="text-align: justify;">De moderne architectuur bestaat uit de culminatie van een aantal belangrijke architecturale principes, zoals <a href="/data-centric-it-met-rest/">Restful API</a>&#8216;s, <a href="/het-event-als-leidend-voorwerp-in-software-engineering/">Event-Driven Architecture</a> (<a href="/geavanceerd-event-driven-engineering/">EDA</a>) en MicroServices, waarover ik reeds meerdere blogs heb geproduceerd (Al deze technologieën maken ook deel uit van de <a href="/de-vortex-van-enablers/">Vortex van Enablers</a>). In de laatste, over <a href="/services-in-alle-maten-van-macro-naar-nano/">Services in alle Maten</a>, gaf ik reeds een uitgebreid, zei het vaag blijvend, voorbeeld over hoe een API (een op clients gericht product&nbsp;!) kan worden geïmplementeerd door een combinatie van (interne) microservices, die met elkaar kunnen communiceren via REST en EDA.</p>
<p style="text-align: justify;">Laten we nu iets concreter ingaan op hoe een modern gebouwde applicatie kan worden gebouwd gebruik makende van deze technologieën. Een dergelijke applicatie staat echter nooit alleen, dus we beschouwen deze samen met zijn onmiddellijke omgeving, bestaande uit clients, maar ook andere applicaties en diensten.</p>
<ul>
<li style="padding-left: 30px;">
<h2>Front-Facing API Ecosystem</h2>
<div style="margin: -60px 0px 0px 0px;">
<p><figure id="attachment_11449" aria-describedby="caption-attachment-11449" style="width: 150px" class="wp-caption alignright"><a href="/wp-content/uploads/2018/03/ui-api.png"><img loading="lazy" decoding="async" class="wp-image-11449" src="/wp-content/uploads/2018/03/ui-api-300x134.png" alt="" width="150" height="67" srcset="https://www.smalsresearch.be/wp-content/uploads/2018/03/ui-api-300x134.png 300w, https://www.smalsresearch.be/wp-content/uploads/2018/03/ui-api.png 386w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a><figcaption id="caption-attachment-11449" class="wp-caption-text">Fig. 3: Symbolisch: De Front End APIs</figcaption></figure></p>
</div>
<p>&nbsp;</p>
<p style="text-align: justify;">We beginnen ons verhaal bij de Front End. Dit betekent dat we de modernisering van de eigenlijke client en gebruikers-interface (UI) in deze blog buiten beschouwing laten. Dit betekent echter niet dat daar geen evoluties zouden zijn, of dat de architectuur van een &#8220;app&#8221; zelf geen modernisering zou behoeven.</p>
<p style="text-align: justify;">Naar de clients en de buitenwereld toe, zijn APIs de belangrijkste evolutie van de voorbije jaren. Meer en meer zal men APIs zélf gaan aanbieden als product naar derde partijen toe, en eveneens naar andere applicaties en diensten binnen de eigen onderneming. Daarbovenop komt nog dat er een proliferatie is geweest aan verschillende kanalen via dewelke een applicatie kan worden gebruikt. Dit zorgt ervoor dat de front end meer en meer een product op zich wordt, dat zich vooral moet bezighouden met het aanbieden van de nodige faciliteiten voor alle mogelijke vormen van interactie met de buitenwereld, en vooral niet met enige andere zaken, zoals de business logica zelf.</p>
<p style="text-align: justify;">Omdat het een goed principe is om alles zo modulair mogelijk te maken (hoe kleiner de aparte componenten, hoe makkelijker men ze afzonderlijk kan aanpassen, of zelfs vervangen via het <a href="https://web.archive.org/web/20170824091654/http://www.cio.com/article/3006635/leadership-management/why-rip-and-replace-it-projects-are-worth-the-effort.html">rip-and-replace</a> principe), bekomt men zo uiteindelijk een volledig ecosysteem van gerelateerde APIs, elk bevoegd voor het afhandelen van een bepaald type interactie met de buitenwereld. De API die achter de traditionele web app staat, zal aldus verschillen van de API die gebruikt wordt voor 3rd party clients. Afhankelijk van hoe sterk de verschillen zijn, kan men er al dan niet voor opteren om achter al deze APIs nog een verenigende API te plaatsen, die zaken zal bevatten die door alle extern gerichte APIs kunnen worden (her-)gebruikt. Een uitgebreid voorbeeld zien we in Figuur 4 (vele andere voorbeelden zijn mogelijk; zo zou de mobiele app ook met de webserver kunnen communiceren).</p>
<p><figure id="attachment_11460" aria-describedby="caption-attachment-11460" style="width: 850px" class="wp-caption aligncenter"><a href="/wp-content/uploads/2018/03/ui-api-complex.png"><img loading="lazy" decoding="async" class="size-full wp-image-11460" src="/wp-content/uploads/2018/03/ui-api-complex.png" alt="" width="850" height="578" /></a><figcaption id="caption-attachment-11460" class="wp-caption-text">Fig. 4: Een uitgebreid voorbeeld van de &#8220;voorkant&#8221; van een applicatie. Hier is gekozen om één algemene API te voorzien voor alle aanvragen die vanaf de buitenwereld op de applicatie afkomen, ondersteund door een aantal andere componenten, die zich specialiseren in het afhandelen van verkeer, specifiek afkomstig van: externe partijen die via RESTful API contact willen leggen; een desktop applicatie, die rechtstreeks met de algemene API communiceert; een mobiele app, die via een mobile backend API werkt; en een web-applicatie, waarvan de webserver met de algemene API communiceert. Al deze API&#8217;s of applicaties worden geïmplementeerd door één of meerdere microservices. Gele pijlen stellen RESTful communicatie voor, de oranje pijlen zijn specifieke communicatie tussen webserver en -client.</figcaption></figure></li>
</ul>
<h2>Beschouwingen</h2>
<p style="text-align: justify;">Wanneer men het voorbeeld bekijkt, zou men kunnen zeggen dat het er ingewikkelder uitziet dan vroeger, toen dit nog gewoon &#8220;de bovenste tier&#8221; was. Schijn bedriegt echter: de APIs worden nu gedragen door gespecialiseerde microservices die met elkaar samenwerken. Dit gedistribueerd systeem heeft uiteraard zijn eigen complexiteit, maar de oorspronkelijke tier had die ook in zekere mate: alleen was ze daar geïnternaliseerd binnen één monolithische component.</p>
<p style="text-align: justify;">Verder zijn er heel wat voordelen verbonden aan de nieuwe architectuur: microservices, die via APIs communiceren, kan men veel sneller aanpassen of zelfs herontwikkelen. Hierdoor kan men sneller reageren op veranderende noden van de business. Daarenboven heeft het ook technische voordelen: de communicatie is nu gestandaardiseerd over http, waardoor (soms onverwachte) integraties een stuk soepeler kunnen worden geïmplementeerd. Bovendien kan men microservices apart schalen, en kan het systeem als geheel zich dus veel elastischer gedragen, afhankelijk van de belasting die het ondervindt. Ten slotte zijn microservices het ideale complement van containers: de basis bouwsteen van een moderne Cloud infrastructuur. Typisch zal men één microservice op één container uitrollen.</p>
<p style="text-align: justify;"><a href="/architecturale-evoluties-deel-2/">In het vervolg</a> zullen we zien hoe commando&#8217;s (zaken die de toestand van de applicatie kunnen veranderen) en query&#8217;s (zaken die informatie opvragen uit applicaties) uit deze bovenste regionen naar de verder liggende backends worden gestuurd en daar worden behandeld. Daar zal ook de kracht van <a href="/blockchain-vs-event-driven-architecture/">Event Driven Architecture</a> tot zijn recht komen.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Wat als we medische parameters zouden kunnen delen?</title>
		<link>https://www.smalsresearch.be/wat-als-we-medische-parameters-zouden-kunnen-delen/</link>
		
		<dc:creator><![CDATA[Renzo Lylon]]></dc:creator>
		<pubDate>Tue, 06 Mar 2018 07:30:15 +0000</pubDate>
				<category><![CDATA[[NL]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[analytics]]></category>
		<category><![CDATA[anonymization]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[business analysis]]></category>
		<category><![CDATA[egov]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[standards]]></category>
		<guid isPermaLink="false">/?p=11317</guid>

					<description><![CDATA[In actiepunt 19 “Mobile Health” van het plan eGezondheid wordt ook gesproken over het van op afstand verzamelen van medische parameters. Diverse oplossingen kunnen hiervoor momenteel gebruikt worden. Deze oplossingen zijn vaak totaaloplossingen: de leverancier levert het registratietoestel, het platform om gegevens te bewaren en de software om de gegevens te visualiseren en te analyseren. [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>In actiepunt 19 “Mobile Health” van het plan eGezondheid wordt ook gesproken over het van op afstand verzamelen van medische parameters. Diverse oplossingen kunnen hiervoor momenteel gebruikt worden. Deze oplossingen zijn vaak totaaloplossingen: de leverancier levert het registratietoestel, het platform om gegevens te bewaren en de software om de gegevens te visualiseren en te analyseren.</p>
<p>Totaaloplossingen hebben als voordeel dat men onmiddellijk beschikt over een werkend systeem dat alle nodige componenten bevat. In proefprojecten en in een eerste fase zijn totaaloplossingen dus zeker een goede benadering om snel resultaten te kunnen boeken.</p>
<p>Hoe meer van dergelijke totaaloplossingen er naast elkaar gebruikt beginnen te worden hoe meer de problemen van deze systemen echter naar boven zullen beginnen komen. De problemen die kenmerkend zijn voor totaaloplossingen zijn onder meer:</p>
<ul>
<li>Als de patiënt een tweede opinie wil dan kan de tweede arts de parameterwaarden niet analyseren indien hij niet hetzelfde systeem gebruikt.</li>
<li>Een gelijkaardig probleem doet zich voor indien een patiënt van arts wenst te veranderen. Indien deze een ander systeem gebruikt, dan moet de patiënt leren werken met een nieuw toestel. Dit is niet voor alle patiënten evident.</li>
<li>Omgekeerd kan een arts ook niet gemakkelijk beslissen om een andere analysesoftware te gebruiken. Andere softwareleveranciers zullen vaak geen toegang hebben tot het gesloten systeem, waardoor de arts nagenoeg verplicht is om dezelfde software te blijven gebruiken. Volledig veranderen van systeem is bij een gesloten omgeving niet evident omdat alle patiënten van de arts dan ook een ander registratietoestel dienen te gebruiken.</li>
<li>Als de systemen worden aangeboden door een ziekenhuis dan zal de huisarts van de patiënt niet altijd een licentie hebben van de gebruikte analysesoftware. Het is voor een huisarts ondoenbaar om over verschillende softwarelicenties te beschikken.</li>
</ul>
<p>Zoals eerder gezegd zijn in proefprojecten of in een eerste fase totaaloplossingen de snelste manier om resultaten te kunnen behalen. Voordat er echter een wildgroei ontstaat van oplossingen die naast elkaar gebruikt worden zou het misschien goed zijn om na te gaan of er geen oplossing gevonden kan worden voor bovenstaande problemen. In deze blogpost wordt een aanzet gegeven van een mogelijke oplossingspiste.</p>
<h1><strong>Oplossingsvoorstel</strong></h1>
<p>Ideaal gezien zou dus zowel de patiënt als de arts / ziekenhuis de vrijheid moeten hebben om zelf te bepalen welke registratietoestellen of software zij respectievelijk gebruiken. Een volledige loskoppeling tussen de systemen die instaan voor de registratie van de gegevens en de software die instaat voor de verdere verwerking zou tegemoetkomen aan een groot deel van de eerder opgelijste problemen.</p>
<p>Een volledige ontkoppeling is echter maar mogelijk wanneer een onafhankelijke partij instaat voor een centraal beheer van de medische parameters. Over wie de onafhankelijke partij zou moeten zijn die verantwoordelijk zou worden voor het registratieplatform wordt in deze blogpost geen uitspraak gedaan. Diverse pistes zijn hiervoor mogelijk.</p>
<p>Het centrale register houdt de waarde van de gemeten parameters bij en stelt deze ter beschikking van de hiertoe gemachtigde gebruikers. De onderstaande afbeelding stelt deze manier van werken schematisch voor.</p>
<p><a href="/wp-content/uploads/2018/01/Schema-1.jpg"><img loading="lazy" decoding="async" class="aligncenter wp-image-11319" src="/wp-content/uploads/2018/01/Schema-1-300x225.jpg" alt="" width="600" height="450" srcset="https://www.smalsresearch.be/wp-content/uploads/2018/01/Schema-1-300x225.jpg 300w, https://www.smalsresearch.be/wp-content/uploads/2018/01/Schema-1-768x576.jpg 768w, https://www.smalsresearch.be/wp-content/uploads/2018/01/Schema-1.jpg 960w" sizes="auto, (max-width: 600px) 100vw, 600px" /></a></p>
<p>Het grote voordeel van een volledige loskoppeling is dat er een gelijk speelveld wordt gecreëerd voor alle partners. Spelers kunnen zich specialiseren in een unieke functie zonder dat ze ook moeten voorzien in de andere componenten van een gesloten systeem. Verder in deze blogpost wordt er dieper ingegaan op het feit dat de creatie van een gelijk speelveld kansen kan bieden aan nieuwe innovatieve spelers.</p>
<h2><strong>Patiënt</strong></h2>
<p>De patiënt zou over de vrijheid moeten beschikken om zelf te bepalen welk toestel hij wenst te gebruiken. Deze vrijheid is natuurlijk enigszins beperkt omdat het toestel in staat moet zijn om met het platform dat de medische parameters beheert te communiceren. Het lijkt aangewezen om deze communicatie zoveel mogelijk te baseren op internationale standaarden. De <em>Continua</em> standaard van de Personal Connected Health Alliance (<a href="https://www.pchalliance.org/">http://www.pchalliance.org/</a>) is bijvoorbeeld een internationale standaard voor medische registratietoestellen. Deze standaard beschrijft onder meer de interface tussen de meettoestellen en de gateway die instaat voor het verzenden van de waardes naar een centraal platform. De website van de organisatie die verantwoordelijk is voor deze standaard bevat een lijst met alle registratietoestellen die momenteel al voldoen aan hun standaard.</p>
<h2><strong>Arts</strong></h2>
<p>Indien een arts niet langer gebruik moet maken van specifieke software dan kan de functionaliteit om de parameterwaarden te visualiseren en analyseren ingebouwd worden in de eigen EMD software. Dit zou als voordeel hebben dat de parameterwaarden gekoppeld kunnen worden aan de al beschikbare informatie over de patiënt. Door deze koppeling zou dus een vollediger beeld ontstaan van de patiënt binnen de eigen EMD-software.</p>
<h2><strong>Anonimisatie van parameterwaarden</strong></h2>
<p>Medische parameters zijn gevoelige informatie en moeten dus maximaal beschermd worden. Anderzijds kan het onder voorwaarden beschikbaar stellen van deze parameters aan derden het ontstaan van een volledig nieuwe dienstverlening tot gevolg hebben. Het lijkt daarom aangewezen om de parameters in een afzonderlijke omgeving op te slaan met een eigen technische identificatiesleutel. De relatie met de burger zou dan bijgehouden kunnen worden in bijvoorbeeld een van de bestaande kluizen (Vitalink, RSW of BGN). De zorgverstrekker die toegang heeft tot de informatie in een van de kluizen beschikt over alle identificatiesleutels om de parameters van een specifiek persoon op te halen. Enkel wie toegang heeft tot het parameterplatform krijgt geanonimiseerde gegevens te zien.</p>
<h2><strong>Ontstaan van nieuwe innovatieve dienstverlening</strong></h2>
<p>Zoals in voorgaande paragraaf aangegeven kan overwogen worden om de geanonimiseerde parameterwaarden ter beschikking te stellen voor verdere verwerking. Deze gegevens kunnen aanleiding geven tot het ontstaan van een nieuwe dienstverlening. Organisaties kunnen bijvoorbeeld de gegevens gebruiken om continu de ingegeven waarden te bewaken. Geavanceerde data analyse technieken of AI detectiemechanismes kunnen ontwikkeld en toegepast worden op de gegevens uit het parameterplatform om eventuele problemen te signaleren. Deze start ups kunnen hun business model bouwen op een toegang tot deze gegevens en hierrond een dienstenaanbod creëren. Het eenvoudig toegankelijk maken van deze gegevens verlaagt de drempel om een nieuwe dienstverlening op te starten. De initiële opstartkosten worden sterk verlaagd indien er geen end-to-end oplossing gerealiseerd moet worden.</p>
<p>Anderzijds kunnen nieuwe spelers ook nieuwe registratietoestellen of apps ontwikkelen en deze aansluiten op het registratieplatform. De enige voorwaarde hierbij is dat deze voldoen aan de gebruikte standaarden. Om deze spelers toe te laten hun toestellen internationaal te vermarkten is het terug belangrijk dat de door het parameterplatform gebruikte standaarden internationale standaarden zijn.</p>
<p><a href="/wp-content/uploads/2018/01/Schema-2.jpg"><img loading="lazy" decoding="async" class="aligncenter wp-image-11326" src="/wp-content/uploads/2018/01/Schema-2-300x225.jpg" alt="" width="600" height="450" srcset="https://www.smalsresearch.be/wp-content/uploads/2018/01/Schema-2-300x225.jpg 300w, https://www.smalsresearch.be/wp-content/uploads/2018/01/Schema-2-768x576.jpg 768w, https://www.smalsresearch.be/wp-content/uploads/2018/01/Schema-2.jpg 960w" sizes="auto, (max-width: 600px) 100vw, 600px" /></a></p>
<p>Algemene opmerking over deze blogpost: deze post ging voornamelijk uit van de arts als verwerker van de gezondheidszorgparameters. Evengoed zou een gelijkaardig verhaal geschreven kunnen worden voor de andere gezondheidszorgverstrekkers.</p>
<p>Daarnaast spreekt het voor zich dat bovenstaande enkel mogelijk is indien een oplossing wordt gevonden voor de diverse problemen die er nu zijn bij de invoering van telecare oplossingen (terugbetalingsmodel, juridische aansprakelijkheid,&#8230; ) en dat er bij de uitwerking van een oplossing rekening moet gehouden worden met de GDPR regelgeving.</p>
<p>______________________</p>
<p><span style="color: #000000;"><em>Dit is een ingezonden bijdrage van Renzo Lylon, business consultant bij Smals Research. </em><em> Dit artikel werd geschreven in eigen naam en neemt geen standpunt in namens Smals.</em></span></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Het eGovernment als Horizontale Dienstverlener?</title>
		<link>https://www.smalsresearch.be/het-egovernment-als-horizontale-dienstverlener/</link>
		
		<dc:creator><![CDATA[Koen Vanderkimpen]]></dc:creator>
		<pubDate>Wed, 24 May 2017 07:53:16 +0000</pubDate>
				<category><![CDATA[[NL]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[cloud computing]]></category>
		<category><![CDATA[cost cutting]]></category>
		<category><![CDATA[data-centric]]></category>
		<category><![CDATA[digital transformation]]></category>
		<category><![CDATA[EDA]]></category>
		<category><![CDATA[egov]]></category>
		<category><![CDATA[Event]]></category>
		<category><![CDATA[G-Cloud]]></category>
		<category><![CDATA[Managing IT costs]]></category>
		<category><![CDATA[methodology]]></category>
		<category><![CDATA[microservices]]></category>
		<category><![CDATA[Privacy]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[rest]]></category>
		<category><![CDATA[software engineering]]></category>
		<category><![CDATA[vortex]]></category>
		<guid isPermaLink="false">/?p=10290</guid>

					<description><![CDATA[We bevinden ons in een wervelstorm van technologische evoluties, die in vele omgevingen aanleiding geven tot nieuwe business modellen. Ook bij het eGovernment, van oudsher gestructureerd in verticale silo&#8217;s, is er een evolutie begonnen naar meer horizontale synergie. Aan de horizon staan echter nog vele opportuniteiten te wachten! In een vorige blog had ik het reeds [&#8230;]]]></description>
										<content:encoded><![CDATA[<p style="text-align: justify;"><img loading="lazy" decoding="async" class="alignleft wp-image-10738" src="/wp-content/uploads/2017/05/be-logo-150x150.png" alt="" width="127" height="127" />We bevinden ons in een <a href="/de-vortex-van-enablers/">wervelstorm van technologische evoluties</a>, die in vele omgevingen aanleiding geven tot nieuwe business modellen. Ook bij het eGovernment, van oudsher gestructureerd in verticale silo&#8217;s, is er een evolutie begonnen naar meer horizontale synergie. Aan de horizon staan echter nog vele opportuniteiten te wachten!</p>
<p><span id="more-10290"></span></p>
<p style="text-align: justify;">In een <a href="/van-chipkaart-naar-smartphone-naar-arm/">vorige blog</a> had ik het reeds over het uitbesteden van gemeenschappelijke zaken, nodig voor meerdere ondernemingen, applicaties &amp; diensten, aan een derde, hierin gespecialiseerde partij. Hetgeen deze laatste partij doet, noemen we &#8220;horizontale dienstverlening&#8221;; men opereert namelijk in een <a href="https://en.wikipedia.org/wiki/Horizontal_market">horizontale markt</a>.</p>
<p style="text-align: justify;">Nu wil ik graag enkele voorbeelden geven van hoe de overheid hetzelfde zou kunnen doen via een <a href="/data-centric-it-met-rest/">data-centric</a> eGovernment (bovenop de vele zaken die ze reeds doet, met b.v. sterke eID authenticatie, de <a href="https://www.gcloud.belgium.be/">G-Cloud</a>, en het eHealth platform).</p>
<h3>Een aantal voorbeelden:</h3>
<ol style="list-style-type: decimal;">
<li>
<h2>Chipkaarten</h2>
<p style="text-align: justify;">In diezelfde <a href="/van-chipkaart-naar-smartphone-naar-arm/">vorige blog</a> vernoemde ik de voordelen die er zouden ontstaan indien we het beheer van chipkaarten zouden afzonderen bij één horizontale chipkaartenbeheerder, en alle gebruikers van deze kaarten dan hiervan gebruik zouden kunnen maken. In een vergevorderd sta<img loading="lazy" decoding="async" class="alignright wp-image-6684" src="/wp-content/uploads/2014/01/export-300x294.png" alt="" width="215" height="211" srcset="https://www.smalsresearch.be/wp-content/uploads/2014/01/export-300x294.png 300w, https://www.smalsresearch.be/wp-content/uploads/2014/01/export.png 376w" sizes="auto, (max-width: 215px) 100vw, 215px" />dium zou het zo in principe zelfs mogelijk worden dat we via één enkele chipkaart van allerlei diensten, aangeboden door verschillende bedrijven (overheid of privé) gebruik kunnen maken, en we dus niet met een <a href="/help-mijn-portefeuille-is-te-dik/">veelheid van de plastieken ondingen in onze portefeuille zouden moeten rondlopen</a>. Dergelijke dienstverlener zou zelfs via een SaaS platform ook aan kleine ondernemingen een paar opties kunnen geven om b.v. aan een bestaande QR code op de chipkaart van een persoon, een klantenkaart te koppelen. Kortom, &#8220;<a href="/one-card-to-rule-them-all/">one card to rule them all</a>&#8220;. Misschien zou de overheid dit kunnen aanbieden via de eID?</p>
</li>
<li>
<h2>&#8220;Waar-woon-ik-as-a-Service&#8221;</h2>
<p style="text-align: justify;">Een eenvoudig, maar krachtig voorbeeld van nuttige en toch min of meer private data, zijn <strong>adressen en adreswijzigingen</strong>. Wat als elke adreswijziging die iemand onderging, onmiddellijk door alle (overheids-)diensten, door de post, door koeriers, en eventueel door een resem andere belanghebbenden was geweten? Dit scenario werkt als volgt:</p>
<ol style="list-style-type: decimal;">
<li>De burger verhuist, en de nodige (fysieke) controles gebeuren.</li>
<li style="text-align: justify;">De gemeenteambtenaar voert dit gegeven in (Dit gegeven valt trouwens onder de noemer &#8220;<a href="https://gcn.com/articles/2016/05/24/civic-moments.aspx">civic moment</a>&#8220;: een belangrijke gebeurtenis in de levensloop van een burger (of bedrijf), die een aantal administratieve gevolgen kan triggeren).</li>
<li style="text-align: justify;">Vanaf dan zijn deze gegevens (zowel het nieuwe adres als de adres<em>verandering</em>) automatisch beschikbaar voor alle overheidsdiensten die er sowieso recht op hebben. Dit is mogelijk via het opvragen van de gegevens (b.v. via <a href="/data-centric-it-met-rest/">REST</a> APIs), maar evenzeer kunnen sommige applicaties onmiddellijk op de hoogte worden gebracht (via <a href="/het-event-als-leidend-voorwerp-in-software-engineering/">Events</a>). Bijgevolg kunnen deze diensten dus automatisch eventuele veranderde rechten en plichten van de burger die van zijn adres afhangen, aanpassen, en uiteraard ook hun briefwisseling naar het nieuwe adres richten.
<p><figure id="attachment_9582" aria-describedby="caption-attachment-9582" style="width: 391px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" class="wp-image-9582" src="/wp-content/uploads/2016/03/eda-rest-e1458906104781.png" alt="" width="391" height="216" /><figcaption id="caption-attachment-9582" class="wp-caption-text">Een microservices architectuur, waarin losgekoppelde applicaties op verschillende manieren kunnen communiceren.</figcaption></figure></li>
<li style="text-align: justify;">Daarnaast kan de overheid, als <em>data custodian </em>(zo noemen we de horizontale dienst van het databeheer), ook een applicatie aanbieden aan de burger zelf, waar deze de mogelijkheid krijgt om applicaties van andere bedrijven toegang te geven tot deze gegevens. Dit zou een beetje kunnen werken zoals een Google of Facebook account: ook tot deze accounts kan men (beperkte en specifieke) <a href="/rest-iam-part-2-oauth/">toegang verlenen</a> aan andere applicaties. De burger zou dus b.v. op die manier aan Bpost de toestemming kunnen geven om deze gegevens automatisch te ontvangen. Vanaf dan zou de post automatisch naar het nieuwe adres kunnen worden doorgestuurd. Sterker nog: men zou het zo kunnen regelen, dat men brieven kan versturen op naam (en/of eventueel een unieke identifier die een burger voor zichzelf kan genereren in de toepassing), en dat de post deze dan vanzelf aan het juiste adres levert. Op die manier zou men niet meer overal zijn échte adres moeten opgeven en verhoogt men dus zelfs de <strong>privacy van de burger</strong>.</li>
<li style="text-align: justify; margin-bottom: 2em;">Ook andere koeriersbedrijven zouden op deze dienst kunnen intekenen en door de burger geauthenticeerd kunnen worden om gebruik te maken van diens door de service gekende adres. Ik wacht trouwens nog steeds op de mogelijkheid om een account te creëren bij een koeriersbedrijf en daarna niet meer mijn adres te moeten geven in elke aparte webshop die ik gebruik, maar gewoon te kunnen aanvinken dat mijn gekozen koerier mijn adres reeds kent!</li>
</ol>
<p style="text-align: justify;">In het voorbeeld maakte ik abstractie van een eventueel apart correspondentie-adres, of het gebruik van meerdere adressen, maar deze zou men even goed door de burger zelf kunnen laten beheren in een centraal aangeboden toepassing.</p>
</li>
<li>
<h2>Civiele &#8220;Half-Open&#8221; Data</h2>
<p style="text-align: justify;">Naast het adres heeft de overheid nog een schat van andere informatie over haar burgers en bedrijven. We moeten uiteraard rekening houden met de privacy van dergelijke data, maar desalniettemin kan deze functie van <em>Data Custodian</em> worden uitgebreid met heel wat interessante mogelijkheden. (Ik verwees in de chipkaartenblog reeds naar het gescheiden beheer van gegevensnetwerken versus de applicaties die ervan gebruik maken. De <a href="/de-vortex-van-enablers/">vortex van enablers</a> maakt dit reeds perfect mogelijk.)</p>
<p style="text-align: justify;">Men zou bijvoorbeeld automatisch rechten kunnen afleiden uit bepaalde situaties die burgers ondergaan (verlies van werk, fysiek letsel, &#8230;) indien deze gebeurtenissen (dit zijn Civic Moments en <a href="/geavanceerd-event-driven-engineering/">Events</a>!) en hun corresponderende nieuwe gegevens snel en automatisch door alle nodige diensten werden opgevangen.</p>
<p style="text-align: justify;">In het voorbeeld van het fysiek letsel zou de burger aan een dokter de toestemming kunnen geven om gegevens i.v.m. langdurige werkonbekwaamheid automatisch door te sturen naar instanties die hiervoor uitkeringen betalen. Een gelijktijdig gevolg, met communicatie naar de Fod SZ, zou kunnen zijn dat de burger automatisch een parkeerkaart voor personen met een handicap zou krijgen toegestuurd.</p>
<p>Deze, en nog vele andere mogelijkheden die ontstaan door de juiste data op het juiste moment op de juiste plaats te krijgen, tonen nogmaals aan dat <a href="/data-centric-it-met-rest/">data-centric IT</a> meer dan ooit van belang is (en &#8211; niet te vergeten &#8211; <a href="/data-centric-security-model/">data-centric security</a>).</li>
</ol>
<h3><a id="digi_trans"></a>Digitale transformatie</h3>
<p style="padding-left: 30px; text-align: justify;">Het eGovernment heeft onlangs reeds een fenomenale stap vooruit gezet als horizontale dienstverlener via de G-Cloud, die ervoor zorgt dat men op infrastructuur- en middlewarevlak synergieën kon creëren. Nu is stilaan het moment aangebroken om verder te beginnen denken: ook bovenop de infrastructuur, binnen en tussen applicaties en vooral door hergebruik van gegevens, ligt er nog een goudmijn van mogelijkheden op ons te wachten. In dergelijke context praat men momenteel dan ook graag over &#8220;Digital Transformation&#8221; (een evolutie die eigenlijk <a href="https://en.wikipedia.org/wiki/Digital_transformation">al heel lang gaande</a> is).</p>
<p style="padding-left: 30px; text-align: justify;">Tot nu toe focuste deze trend zich <img loading="lazy" decoding="async" class="alignright wp-image-10751" src="/wp-content/uploads/2017/05/belgdigital-300x243.png" alt="" width="371" height="302" srcset="https://www.smalsresearch.be/wp-content/uploads/2017/05/belgdigital-300x243.png 300w, https://www.smalsresearch.be/wp-content/uploads/2017/05/belgdigital-1024x830.png 1024w, https://www.smalsresearch.be/wp-content/uploads/2017/05/belgdigital.png 1101w" sizes="auto, (max-width: 371px) 100vw, 371px" />binnen de overheid daarbij vooral op <strong>kostenbesparingen</strong>: hoe hetzelfde doen, maar dan op een efficiëntere manier? Dit is uiteraard nuttig, maar Digitale Transformatie gaat veel verder dan dat (ook volgens de <a href="https://www.infoworld.com/article/3152507/it-strategy/the-5-myths-of-digital-transformation.html">blogosphere</a>, en ook wanneer het specifiek over <a href="https://www.govtech.com/featured/Cloud-Is-More-Than-Cost-Savings.html">Cloud</a> gaat). De ware kracht van deze trend mag niet verloren gaan in oeverloze discussies over hoe alles goedkoper kan, of hoe de bestaande zaken met de nieuwe technologie efficiënter kunnen worden gemaakt.</p>
<p style="padding-left: 30px; text-align: justify;">Ik durf hierbij zelfs <a href="https://www.infoworld.com/author/Bob-Lewis/">Bob Lewis</a> bij te treden: IT plannen moeten niet gedreven worden door de noden van de business, maar <strong>de business strategie moet gedreven worden door de nieuw beschikbare technologische mogelijkheden!</strong></p>
<p style="padding-left: 30px; text-align: justify;">Welnu: de technologieën die een grote evolutie mogelijk maken, zijn gearriveerd. Laten we onze inspiratie de vrije teugels geven, en bedenken wat voor interessante diensten we nog kunnen bieden, aan zowel de ambtenaren van ons land, als aan zijn burgers en bedrijven.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
