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

<image>
	<url>https://www.smalsresearch.be/wp-content/uploads/2026/01/cropped-cropped-Smals_Research-32x32.png</url>
	<title>architecture &#8211; Smals Research</title>
	<link>https://www.smalsresearch.be</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>De vier gezichten van EDA</title>
		<link>https://www.smalsresearch.be/de-vier-gezichten-van-eda/</link>
		
		<dc:creator><![CDATA[Koen Vanderkimpen]]></dc:creator>
		<pubDate>Tue, 20 Dec 2022 08:30:00 +0000</pubDate>
				<category><![CDATA[[NL]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[architecture]]></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 design]]></category>
		<category><![CDATA[software engineering]]></category>
		<guid isPermaLink="false">/?p=17574</guid>

					<description><![CDATA[Event Driven Architecture (EDA) is niet meer weg te schrijven uit moderne software-architectuur. Maar wanneer ben je nu effectief EDA aan het gebruiken? Soms kan het zijn dat dit paradigma in je software-systeem zit, zonder dat je er erg in hebt. En daarnaast gebeurt het ook vaak dat een architect zegt dat zijn systeem EDA [&#8230;]]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image alignleft size-full is-resized"><a href="/wp-content/uploads/2022/12/EDA.png"><img decoding="async" src="/wp-content/uploads/2022/12/EDA.png" alt="" class="wp-image-17967" width="182" height="157" srcset="https://www.smalsresearch.be/wp-content/uploads/2022/12/EDA.png 569w, https://www.smalsresearch.be/wp-content/uploads/2022/12/EDA-300x259.png 300w" sizes="(max-width: 182px) 100vw, 182px" /></a></figure>



<p class="justify-text">Event Driven Architecture (EDA) is niet meer weg te schrijven uit moderne software-architectuur. Maar wanneer ben je nu effectief EDA aan het gebruiken? Soms kan het zijn dat dit paradigma in je software-systeem zit, zonder dat je er erg in hebt. En daarnaast gebeurt het ook vaak dat een architect zegt dat zijn systeem EDA gebruikt, maar dat de toehoorders zich daar iets heel anders bij voorstellen dan wat die architect eigenlijk bedoelt. Meestal ontstaat deze verwarring doordat er een aantal verschillende patronen bestaan, die allemaal onder dezelfde noemer van EDA vallen. In deze blog laten we ons licht schijnen op de 4 belangrijkste <a href="/het-event-als-leidend-voorwerp-in-software-engineering/" data-type="post" data-id="8942">vormen van EDA</a>.</p>



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



<p class="justify-text">Alle 4 deze vormen van EDA, zullen natuurlijk gebruik maken van de basis: een set van Event producers kan Events genereren en aan een of ander kanaal geven, waarna de Events worden afgeleverd aan een set van Event consumers. Zowel producers als consumers communiceren enkel met het kanaal (typisch een Event Broker) en hoeven elkaar voor de rest niet te contacteren (althans wat het versturen en ontvangen van de Events betreft).</p>



<h2 class="wp-block-heading">Event Notification</h2>



<p class="justify-text">De eerste manier om aan EDA te doen is de meest eenvoudige: een Event wordt hier simpelweg verstuurd om aan te geven dat er iets is gebeurd. Bijvoorbeeld een &#8216;CustomerChangedEvent&#8217; om aan te geven dat er iets werd aangepast aan een klantenfiche, of een &#8216;OrderPlacedEvent&#8217; om aan te geven dat er een nieuw order is.</p>



<figure class="wp-block-image size-full"><a href="/wp-content/uploads/2022/12/publish-subscribe.png"><img fetchpriority="high" decoding="async" width="927" height="628" src="/wp-content/uploads/2022/12/publish-subscribe.png" alt="" class="wp-image-17964" srcset="https://www.smalsresearch.be/wp-content/uploads/2022/12/publish-subscribe.png 927w, https://www.smalsresearch.be/wp-content/uploads/2022/12/publish-subscribe-300x203.png 300w, https://www.smalsresearch.be/wp-content/uploads/2022/12/publish-subscribe-768x520.png 768w" sizes="(max-width: 927px) 100vw, 927px" /></a><figcaption class="wp-element-caption">Figuur 1: Aan de basis van alle vormen van EDA ligt het publish-subscribe mechanisme. Publishers genereren Events en sturen deze naar een Systeem dat deze verder zal verspreiden. Sunscribers schrijven zich in voor bepaalde soorten van Events en zullen deze toegestuurd krijgen door het Event Systeem wanneer ze zich voordoen.</figcaption></figure>



<p class="justify-text">Belangrijk in dit patroon, is dat de Events verder geen toestand bevatten. Als de ontvangers van het event dus willen weten wát er precies is veranderd aan de klantenfiche, of wát er besteld werd in het order, dan zullen ze toch actief initiatief moeten nemen om aan deze informatie te geraken. Typisch zullen er dan, na het ontvangen van een event, <a href="/data-centric-it-met-rest/" data-type="post" data-id="9535">API calls</a> moeten worden gedaan naar het systeem dat rond de bron van het Event ligt, om meer details te bekomen.</p>



<p class="justify-text">De voordelen van dit patroon liggen voornamelijk in de eenvoud ervan: de Events zijn heel erg &#8216;lightweight&#8217; en eenvoudig te implementeren. Een ander voordeel is dat het systeem dat Events verstuurt, niet hoeft te weten welke systemen er allemaal in de informatie zijn geïnteresseerd: ze zullen de informatie wel komen halen eens ze het Event ontvangen. Er wordt dus al een zekere mate van &#8216;<a href="/architecturale-evoluties-deel-1/" data-type="post" data-id="11434">louse coupling</a>&#8216; en &#8216;<a href="/architecturale-evoluties-deel-2/" data-type="post" data-id="11475">Inversion of Control</a>&#8216; bereikt.</p>



<p class="justify-text">Het nadeel van dit patroon is dat het aantal communicaties dat nodig is om bepaalde informatie te verspreiden naar de plaatsen waar ze nodig is, wordt verdubbeld: één keer om het Event te sturen, een tweede maal wanneer er extra informatie wordt gevraagd. Bovendien bestaat er nog steeds een afhankelijkheid in één richting, omdat de systemen die extra informatie nodig hebben, zullen moeten weten waar ze te gaan halen.</p>



<p class="justify-text">Het zal niet verbazen dat deze eenvoudige manier van werken met Events, met overwicht nog steeds de meest gebruikte vorm is, en dat, wanneer er wordt gezegd &#8220;ons systeem maakt gebruik van EDA&#8221;, er dus meestal Event Notification wordt bedoeld. Dit is echter lang niet de meest krachtige en voordelige manier om van het paradigma gebruik te maken&#8230;</p>



<h2 class="wp-block-heading">Event-Carried State Transfer</h2>



<p class="justify-text">Deze tweede manier van werken is de gouden middenweg tussen het toepassen van de volledige kracht van EDA, en het loslaten van de bijhorende complexiteit op een systeem. Het is ook hetgeen de echte voorstanders van EDA begrijpen, wanneer ze van een architect horen dat het paradigma wordt toegepast.</p>



<p class="justify-text">De naam Event-carried State Transfer (EST&nbsp;?) is gekozen om een beetje te contrasteren met REST (<a href="/event-driven-apis/" data-type="post" data-id="16655">Representational State Transfer</a>). Er is dus sprake van het overbrengen van toestand, t.t.z. effectieve gegevens, tussen systemen. Als we het vorige voorbeeld hernemen, dan zal er aan het <em>CustomerChangedEvent</em> effectief zijn toegevoegd wát er precies is veranderd: minimum wat het nieuwe gegeven is, eventueel ook wat het oude gegeven was, en mogelijks zelfs een hele resem extra gegevens over de klant. Dit vormt meteen ook de moeilijkste evenwichtsoefening bij het ontwerp: hoeveel data zullen we precies toevoegen aan het Event? De bedoeling is natuurlijk dat de ontvanger van het Event alles heeft wat er nodig is om verder te kunnen, zonder nog extra gegevens te moeten gaan opvragen.</p>



<p class="justify-text">De voordelen van dit patroon zijn uiteraard precies de nadelen van het vorige: als het Event het juiste &#8216;gewicht&#8217; heeft, kan extra communicatie tussen alle partijen worden vermeden, en zijn de systemen dus bijgevolg ook wederzijds onafhankelijk van elkaar: ze hoeven enkel nog met het kanaal te praten via welke Events worden beheerd. Elk systeem kan direct aan de slag met de juiste informatie die door het Event wordt aangeleverd.</p>



<p class="justify-text">Een bijkomend voordeel is dat de Events volgens dit paradigma een grotere mate van herbruikbaarheid hebben: men kan een catalogus aanleggen van Events die beschikbaar zijn in een <a href="/ecosysteem-architectuur/" data-type="post" data-id="16980">ecosysteem van applicaties</a> als primaire manier om gegevens over te brengen: een volwaardig alternatief voor RESTful APIs. Elke nieuwe applicatie die de aangeboden informatie kan gebruiken, kan zich dan inschrijven om het desbetreffende Event te ontvangen.</p>



<p class="justify-text">Nadeel is dat deze manier van werken met Events iets meer werk vraagt: men zal moeten nadenken over welke Events het meest nuttig zijn en hoeveel informatie deze best bevatten. Men zal de Events moeten opnemen in een catalogus, zodat ze optimaal worden hergebruikt. Daarnaast krijgt men soms wat overbodig dataverkeer omdat de Events mogelijks meer informatie bevatten dan de ontvanger nodig heeft. De architecturale complexiteit is echter slechts een weinig hoger dan bij Event Notifications (voor de applicties die Events versturen blijft het b.v. gewoon &#8220;iets extra doen op sommige momenten&#8221;).</p>



<p class="justify-text">Een laatste aandachtspunt is dat het inzetten van EDA om toestand te verspreiden overheen systemen de notie van <a href="/eventual-consistency-1/" data-type="post" data-id="15544">Eventual Consistency neigt te activeren. Dit kan zowel voordelen als nadelen hebben</a>.</p>



<p class="justify-text">Event-Carried State Transfer komt dan wel al wat vaker voor dan vroeger (en ligt ook meestal aan de basis van het populair geworden <a href="/de-reactive-hype/" data-type="post" data-id="14280">event streaming</a>), maar er ligt nog heel wat onaangeroerd potentieel om met deze manier van werken grote voordelen te behalen in <a href="/ecosysteem-architectuur-een-voorbeeld-in-de-sociale-sector/" data-type="post" data-id="17006">sommige applicatie-ecosystemen</a>.</p>



<h2 class="wp-block-heading">Event Sourcing</h2>



<p class="justify-text">Nu komen we bij de echte kern van het paradigma, waarbij we radicaal voor EDA kiezen doorheen het volledige ontwerp van ons systeem. Waar de vorige manieren van werken nog weinig intrusief waren in de architectuur, is dit bij Event Sourcing niet langer het geval: de architectuur is nu volledig op Events gebaseerd.</p>



<p class="justify-text">Bij Event Sourcing zal een systeem niet meer op de normale manier zijn toestand gaan bepalen of bewaren, maar zal de huidige toestand steeds gezien worden als gevolg van het ontvangen van een reeks van Events, die elk een kleine toestandswijziging teweegbrengen. Je kan het zien als een bankrekening: het huidige saldo is simpelweg het resultaat van alle voorbije verrichtingen. Een ander goed voorbeeld betreft <a href="/git-de-definitieve-leider-van-de-versiecontrole/" data-type="post" data-id="3518">versiecontrolesystemen</a> zoals git: bij zo&#8217;n systeem is de huidige toestand samengesteld uit alle voorbije &#8216;commits&#8217;. Er zijn nog heel wat meer zaken te vertellen over Event Sourcing, maar we bespraken deze manier van werken <a href="/geavanceerd-event-driven-engineering/" data-type="post" data-id="9041">reeds uitgebreid</a> in een <a href="/de-vortex-van-enablers/" data-type="post" data-id="10419">aantal vorige blogs</a>.</p>



<p class="justify-text">Het grote nadeel van Event Sourcing is de sterk verhoogde complexiteit van de software die volgens dit paradigma is gebouwd. Men zal dus goed moeten overwegen of de krachtige mogelijkheden die door het gebruik ervan ontstaan, deze complexiteit waard zijn. Het feit dat Event Sourcing zelden wordt gebruikt en er daardoor slechts weinig architecten voldoende ervaring mee hebben, maakt dit echter erger dan het zou moeten zijn: eens men deze andere manier van werken in de vingers heeft, kan men pas goed de voordelen ervan appreciëren.</p>



<p class="justify-text">De voordelen van Event Sourcing bevatten namelijk de voordelen van Event-carried State Transfer, en breiden deze nog uit: men heeft nu toegang tot de volledige geschiedenis van de applicatie, en niet enkel de huidige toestand. Hierdoor kan men stukken uit het verleden &#8216;terug gaan afspelen&#8217;, wat goed van pas kan komen bij testing en debuggen, of wat veel mogelijkheden geeft bij analytics van deze gegevens. Een event sourced systeem is door deze geschiedenis ook heel geschikt voor audit logs.</p>



<p class="justify-text">Bij gebruik van Event Sourcing kan men de applicatie zelfs ontwerpen zonder echte database: men kan de huidige toestand gewoon in het werkgeheugen plaatsen, zolang de Events zelf goed worden gepersisteerd. Bij falen kan men dan steeds de toestand terug opbouwen op basis van de Event Store (in de praktijk gecombineerd met snapshots van de toestand op geregelde tijdstippen).</p>



<p class="justify-text">Wanneer men al gebruik maakt van Event Sourcing, dan moet men ervoor opletten niet automatisch ook de volgende stap te nemen&#8230;</p>



<h2 class="wp-block-heading">Command Query Responsibility Segregation</h2>



<p class="justify-text">De meeste applicaties worden opgebouwd rond een CRUD (create, read, update, delete) systeem. Soms kan het echter interessant zijn om een applicatie op te splitsen in meerdere componenten: degene die schrijven naar de datastore en degene die er in gaan lezen. Je hebt hier dus verschillende modellen waarmee wordt gewerkt: één dat updates behandelt en één (of meerdere) dat queries behandelt. Deze opsplitsing noemen we Command Query Responsibility Segregation (CQRS). Ook CQRS bespraken we reeds in <a href="/tag/cqrs/" data-type="post_tag" data-id="805">eerdere blogs</a>.</p>



<figure class="wp-block-image alignleft size-full"><a href="/wp-content/uploads/2022/02/usingCQRS-Events.png"><img decoding="async" width="467" height="441" src="/wp-content/uploads/2022/02/usingCQRS-Events.png" alt="" class="wp-image-17035" 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="(max-width: 467px) 100vw, 467px" /></a><figcaption class="wp-element-caption">Figuur 2: CQRS. We splitsen het systeem in een deel voor updates en een deel voor queries. De beide delen communiceren via Events.</figcaption></figure>



<p class="justify-text">In theorie kan deze manier van werken zonder EDA, maar in de praktijk zullen Events altijd de beste manier vormen voor de communicatie tussen de verschillende subsystemen. Commando&#8217;s resulteren dan in Events met bepaalde inputs, die op hun beurt resulteren in Events betreffende toestands-wijzigingen. Query systemen die kort op de bal moeten spelen, schrijven zich in voor deze events en passen bij elk Event onmiddellijk hun uit te lezen toestand aan.</p>



<p class="justify-text">CQRS introduceert enorm veel complexiteit in een systeem. Het is dus zaak van te kijken of het echt serieuze voordelen kan opleveren. Sommige erg complexe business domeinen hebben baat bij deze opsplitsing, omdat het kan resulteren in een kleinere hoeveelheid logica per deelsysteem, indien dat deelsysteem is toegespitst op slechts één verantwoordelijkheid (update of query). In de meerderheid van de gevallen is er echter grote overlap tussen de logica voor updates en deze voor queries, waardoor het delen van een model efficiënter is. De principes van <a href="/ecosysteem-architectuur/" data-type="post" data-id="16980">Domain Driven Design</a> kunnen hier helpen.</p>



<p class="justify-text">Een andere reden om CQRS te gebruiken vinden we in performantie en beschikbaarheid: een systeem dat zelden wordt geüpdated en vaak queries krijgt (of omgekeerd) kan baat hebben bij het splitsen van deze verantwoordelijkheden, zodat de componenten apart kunnen worden geschaald (maar ook hier zijn er, naast CQRS, eventueel alternatieve architecturen mogelijk).</p>



<p class="justify-text">Kort samengevat: CQRS kan heel krachtig zijn, maar is ook erg complex. <em>Use with Caution</em>.</p>



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



<p class="justify-text">Nu we de vier voornaamste manieren hebben onderscheiden om gebruik te maken van Event Driven Architecture, zijn we in staat om preciezer te communiceren over het paradigma, en voor elk project een weloverwogen keuze te maken tussen de verschillende werkwijzen.</p>



<p class="justify-text">Event Notification kunnen we zien als <em>beginnelingen-EDA</em>, en is het makkelijkst toe te voegen aan een bestaand systeem. Het kan reeds meerwaarde brengen en de betrokkenen &#8216;opwarmen&#8217; voor het echte werk. Event Carried State Transfer is een krachtiger mechanisme, met een complexiteit die nog goed onder controle blijft. Deze twee eerste methoden om Events te gebruiken, spelen vooral in op de interactie tussen verschillende systemen, en hebben iets minder invloed op de interne werking ervan.</p>



<p class="justify-text">De zaken veranderen wanneer we kijken naar Event Sourcing en CQRS. Deze paradigma&#8217;s werken echt in op de kern van de architectuur binnen een welbepaald systeem, en voegen een behoorlijke dosis complexiteit toe. In bepaalde gevallen is dit het echter waard, vanwege de krachtige en unieke voordelen die op deze manier worden verkregen.</p>



<p></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 loading="lazy" 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="auto, (max-width: 163px) 100vw, 163px" /></a></figure></div>



<p class="justify-text">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">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">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">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">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">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">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 loading="lazy" 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="auto, (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"><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"><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"><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"><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">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">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">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></p>



<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Serverless Architecture: Is Software nu Lego?</title>
		<link>https://www.smalsresearch.be/serverless-architecture-is-software-nu-lego/</link>
		
		<dc:creator><![CDATA[Koen Vanderkimpen]]></dc:creator>
		<pubDate>Tue, 17 Dec 2019 08:23:22 +0000</pubDate>
				<category><![CDATA[[NL]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[architecture]]></category>
		<category><![CDATA[cloud computing]]></category>
		<category><![CDATA[Container]]></category>
		<category><![CDATA[EDA]]></category>
		<category><![CDATA[EDE]]></category>
		<category><![CDATA[Event]]></category>
		<category><![CDATA[FaaS]]></category>
		<category><![CDATA[FPaaS]]></category>
		<category><![CDATA[Kubernetes]]></category>
		<category><![CDATA[microservices]]></category>
		<category><![CDATA[PaaS]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[Serverless]]></category>
		<category><![CDATA[Software architectures]]></category>
		<category><![CDATA[software design]]></category>
		<category><![CDATA[software engineering]]></category>
		<guid isPermaLink="false">/?p=13933</guid>

					<description><![CDATA[Serverless: de ideale link tussen APIs, Events, en je eigen code. Serverless Computing is een Cloud Computing model waarbij de gebruikers enkel code en een stuk configuratie aanleveren voor een beoogde software, en de cloud provider de volledige verantwoordelijkheid in handen neemt voor het beheer van de onderliggende resources (rekenkracht, geheugen, netwerk, etc.). De gebruikers [&#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/12/mijn-logo.png" alt="" class="wp-image-13973" width="133" height="133" srcset="https://www.smalsresearch.be/wp-content/uploads/2019/12/mijn-logo.png 685w, https://www.smalsresearch.be/wp-content/uploads/2019/12/mijn-logo-150x150.png 150w, https://www.smalsresearch.be/wp-content/uploads/2019/12/mijn-logo-300x300.png 300w" sizes="auto, (max-width: 133px) 100vw, 133px" /></figure></div>



<p class="has-text-align-center"><em>Serverless: de ideale link tussen APIs, Events, en je eigen code.</em></p>



<p class="justify-text">Serverless Computing is een Cloud Computing model waarbij de gebruikers enkel code en een stuk configuratie aanleveren voor een beoogde software, en de cloud provider de volledige verantwoordelijkheid in handen neemt voor het beheer van de onderliggende resources (rekenkracht, geheugen, netwerk, etc.). De gebruikers zijn normaal gezien software ontwikkelaars, en het concept valt dan ook onder de noemer &#8220;<a href="/productiviteitsverhoging-met-paas/">Platform as a Service</a>&#8221; (PaaS). Bij Gartner wordt deze technologie ook <a href="https://blogs.gartner.com/tony-iams/containers-serverless-computing-pave-way-cloud-native-infrastructure/">Functional Platform as a Service</a> (FPaaS) genoemd. Elders gebruikt men kortweg de term &#8220;<a href="https://en.wikipedia.org/wiki/Function_as_a_service">Function as a Service</a>” (FaaS).</p>



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



<p class="justify-text">Serverless gaat dus nog een stuk verder dan wat momenteel als &#8220;mainstream&#8221; PaaS-gebruik kan worden beschouwd: <a href="/disruptie-in-de-cloud-stack-caas/">Container platformen en Kubernetes</a>. Bij deze laatste is de developer zelf nog verantwoordelijk voor een deel van de &#8220;<a href="/architecturale-evoluties-deel-2/">stack</a>&#8221; en bepaalt daarmee zelf voor een groot deel op welke manier de software binnen de container zal werken, en daarmee dus ook over de manier waarop de gecompileerde programmacode wordt geïnstalleerd en uitgerold. Bij Serverless zal men enkel broncode (en een stuk tekstuele configuratie) uploaden naar het platform. De configuratie bepaalt daarbij op welke manier het stuk code kan worden opgeroepen (daarover dadelijk meer). Ook de <a href="/services-in-alle-maten-van-macro-naar-nano/">granulariteit</a> van Serverless is typisch kleiner dan die van Containers: meestal wordt er slechts één specifieke functie per Serverless eenheid geïmplementeerd, tegenover typisch een volledige <a href="/van-n-tier-naar-microservices/">microservice</a> (of groter&#8230;) bij Containers.</p>



<div class="wp-block-image justify-text"><figure class="alignright is-resized"><img loading="lazy" decoding="async" src="/wp-content/uploads/2019/12/lambda.png" alt="" class="wp-image-13958" width="82" height="82"/><figcaption>AWS Lambda</figcaption></figure></div>



<p class="justify-text">Serverless Architecture verwierf bekendheid dankzij het product &#8220;<a href="https://aws.amazon.com/lambda/">AWS Lambda</a>&#8221; van Amazon. Dit is momenteel nog steeds het platform waarrond het meest furore wordt gemaakt, mede dankzij een verregaande integratie met de rest van de AWS platformen. Je kan b.v. erg interessante zaken doen rond <a href="https://www.cloudforecast.io/blog/event-driven-pipeline-aws-serverless/">event-based monitoring</a>.  Naast Amazon hebben alle grotere Cloud providers nu wel een Serverless oplossing, en er zijn ook reeds enkele open source initiatieven ontstaan (b.v. <a href="https://kubeless.io/">Kubeless</a>, een platform dat bovenop een Kubernetes cluster werkt), waarmee je op je eigen infrastructuur een FPaaS kan gaan opzetten.</p>



<h2 class="wp-block-heading">Serverless = Event Driven</h2>



<p class="justify-text">Men kan dus als het ware functies in een Cloud uitrollen, maar hoe worden deze dan uiteindelijk opgeroepen? Daar komt de configuratie bij te pas. Zo&#8217;n functie zal men namelijk typisch oproepen als gevolg van één of andere gebeurtenis, en dit zal men dan definiëren in de bijhorende configuratie. Indien het een functie is die een website ondersteunt kan dit b.v. een <a href="/data-centric-it-met-rest/">oproep naar een bepaalde API zijn</a>, waar de functie dan een stukje van implementeert. Maar in principe kan men de functie laten reageren op alle mogelijke soorten gebeurtenissen, zolang men deze gebeurtenissen kan capteren via het gebruikte Cloud platform. Voorbeelden zijn legio:</p>



<ul class="wp-block-list"><li>Business Events (b.v. een bestelling wordt geplaatst)</li><li>Events gepubliceerd door andere software (mogelijks andere Serverless functies)</li><li>Het binnenkomen van nieuwe data (b.v. door het monitoren van een database of door het volgen van een zogenaamde &#8220;stream&#8221;, dus eigenlijk een vorm van &#8220;<a href="https://en.wikipedia.org/wiki/Reactive_programming">Reactive Programming</a>&#8220;).</li><li>Het verstrijken van een bepaalde hoeveelheid tijd (dit komt neer op scheduling)</li><li>Het binnenkomen van sensor data (denk aan <a href="/er-zit-een-hacker-in-mijn-diepvries/">Internet of Things</a>)</li></ul>



<p class="justify-text">De mogelijkheden zijn in principe eindeloos. Men kan dus eigenlijk stellen dat Serverless Architecture een vorm is van <a href="/het-event-als-leidend-voorwerp-in-software-engineering/">Event Driven Architecture</a>, waarbij van het infrastructuur aspect abstractie wordt gemaakt. Over <a href="/geavanceerd-event-driven-engineering/">Event Driven Engineering</a> hebben we reeds uitvoerig <a href="/de-vortex-van-enablers/">geblogd</a>.</p>



<h2 class="wp-block-heading">Voor- en Nadelen</h2>



<p>Serverless is een nuttige technologie aan het worden, met duidelijke voordelen. Er moet echter nog een beetje gezocht worden naar oplossingen voor enkele problemen&#8230;</p>



<h3 class="wp-block-heading">Pay Per Use</h3>



<p class="justify-text">In de meeste platformen zal men een Serverless functie enkel uitvoeren en dit aanrekenen, wanneer ze daadwerkelijk wordt opgeroepen. Je betaalt dus enkel voor het daadwerkelijke verbruik ervan, en wanneer ze niet wordt gebruikt, betaal je niets. Dit principe noemt men &#8220;Scale to Zero&#8221;. Dit kan echter ook een nadeel zijn: als de functie echt enorm veel gebruikt wordt, zal de prijs typisch nogal oplopen en kan het interessanter worden deze op een andere manier aan te bieden (b.v. door een aantal containers die men permanent actief maakt, aan een lagere maandelijkse kost).</p>



<h3 class="wp-block-heading">Schaalbaarheid en Elasticiteit</h3>



<p class="justify-text">Deze aspecten zijn nu heel gemakkelijk. Een functie heeft typisch geen toestand, en vermits de developer enkel rekening moet houden met de code voor één uitvoering, is het de Cloud provider die instaat voor het verzorgen van parallellisatie en alle andere aspecten die bij een verhoogde schaal komen kijken. Men krijgt dus als het ware een zeer flexibele schaalbaarheid cadeau (en in het geval van een publieke Cloud Provider ook een quasi oneindige). Daartegenover staat weliswaar dat de performantie bij een laag gebruik iets slechter kan zijn, vermits een serverless functie normaal gezien pas wordt geïnitialiseerd (en resources krijgt) op het moment dat ze wordt opgeroepen.</p>



<h3 class="wp-block-heading">Veiligheid</h3>



<p class="justify-text">Ook het veiligheidsaspect is een tweesnijdend zwaard: alhoewel men zich minder zorgen moet maken over de veiligheid van onderliggende infrastructuur (de Cloud Provider doet dit normaal gezien volgens de state of the art), vergroot men op een andere manier de zogenaamde &#8220;attack surface&#8221;. Typisch zal men voor een volledige oplossing heel veel kleine functies nodig hebben, en het aantal toegangswegen tot de applicatiecode is op die manier groter.</p>



<h3 class="wp-block-heading">Eenvoudige Ontwikkeling, Complex Beheer</h3>



<p class="justify-text">De productiviteit van de ontwikkelaars zal waarschijnlijk een stuk hoger zijn, gezien ze enkel rekening moeten houden met functionaliteit en code, en veel minder belang moeten hechten aan onderliggende infrastructuur. Daartegenover staat een verhoogde vendor lock-in: een stuk van de code en de configuratie zal typisch gebruik maken van vendor-specifieke functies, die men bij een andere provider niet zal terugvinden.</p>



<p class="justify-text">Daarnaast is er een groot nadeel verbonden aan het bouwen van een groot web van interopererende functies: de complexiteit van dit gedistribueerde geheel. <em>Er ontstaat als het ware een doos vol kleine &#8220;legoblokjes&#8221; van allerlei functies</em>, die men dan wel nog met een goed plan tot een mooi geheel in elkaar zal moeten puzzelen. In principe is dit niet nieuw: zelfs binnen monolithische applicaties moet men aandacht besteden aan allerlei componenten en stukken code die onderling afhankelijk zijn, omdat ze elkaar oproepen of dezelfde resources gebruiken. Maar doordat deze complexiteit nu verschuift naar de configuratie en het platform, en ze typisch overheen een netwerk zal reiken, wordt het een probleem van beheersbaarheid en routering, eerder dan van code kwaliteit. Men zal nog goede manieren moeten vinden om dit soort zaken beter te gaan ondersteunen, misschien zelfs door encapsulatie, zoals dit reeds vrij goed op punt staat voor het eigenlijke programmeerwerk.</p>



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



<p class="justify-text">Serverless Architecture is een snel maturerende technologie met duidelijke voordelen. De FaaS platformen maken zeker deel uit van wat de aantrekkingskracht van de Cloud groter maakt. Ze moeten zich echter nog iets grondiger gaan bewijzen: nu komt het er op aan om de laatste nadelen, zoals de beheersbaarheid, nog op punt te stellen en om de meest nuttige toepassingen voor deze architectuur te vinden en te bouwen.</p>



<p>

_________________________</p>



<p><em>Dit is een ingezonden bijdrage van Koen Vanderkimpen, IT consultant bij Smals Research. &nbsp;Dit artikel werd geschreven in eigen naam en neemt geen standpunt in namens Smals.</em></p>
]]></content:encoded>
					
		
		
			</item>
		<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 style="text-align:center"><em>Hergebruik: het gebruiken van een bestaand stuk software voor een nieuwe toepassing</em>.</p>



<p class="justify-text">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">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">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">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">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">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">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">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">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">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">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">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">Ik heb nu reeds tweemaal modulariteit en microservices aangehaald, maar daar moet wel een serieuze kanttekening bij worden gemaakt.</p>



<p 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">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">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">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">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">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">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">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></p>



<p></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>Services in alle Maten: van Macro naar Nano</title>
		<link>https://www.smalsresearch.be/services-in-alle-maten-van-macro-naar-nano/</link>
		
		<dc:creator><![CDATA[Koen Vanderkimpen]]></dc:creator>
		<pubDate>Mon, 27 Nov 2017 10:33:40 +0000</pubDate>
				<category><![CDATA[[NL]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[architecture]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[EDA]]></category>
		<category><![CDATA[Event]]></category>
		<category><![CDATA[methodology]]></category>
		<category><![CDATA[microservices]]></category>
		<category><![CDATA[rest]]></category>
		<category><![CDATA[SOA]]></category>
		<category><![CDATA[Software architectures]]></category>
		<category><![CDATA[software design]]></category>
		<category><![CDATA[software engineering]]></category>
		<guid isPermaLink="false">/?p=11111</guid>

					<description><![CDATA[Eén van de grote hypes in de wereld van de software architectuur, is het gebruik van MicroServices. Vaak is het &#8220;micro&#8221; aspect echter een beetje overkill, en maakt men eerder &#8220;MiniServices&#8221;. Deze blog werpt een blik op welke maten en gewichten van services er zoal bestaan. We zullen het daarbij hebben over een aantal categorieën [&#8230;]]]></description>
										<content:encoded><![CDATA[<p style="text-align: justify;"><a href="/wp-content/uploads/2016/06/logomicro.png"><img loading="lazy" decoding="async" class="alignleft size-thumbnail wp-image-9733" src="/wp-content/uploads/2016/06/logomicro-150x150.png" alt="" width="150" height="150" /></a>Eén van de grote hypes in de wereld van de software architectuur, is het gebruik van MicroServices. Vaak is het &#8220;micro&#8221; aspect echter een beetje overkill, en maakt men eerder &#8220;MiniServices&#8221;. Deze blog werpt een blik op welke maten en gewichten van services er zoal bestaan.</p>
<p style="text-align: justify;"><span id="more-11111"></span></p>
<p style="text-align: justify;">We zullen het daarbij hebben over een aantal categorieën of grootteordes van services: <a href="/van-n-tier-naar-microservices/">microservices</a>, miniservices en macroservices. En dan zetten we er ook nog zogenaamde nanoservices langs, die eigenlijk (nog?) geen officiële definitie hebben&#8230; Al deze architecturele paradigma&#8217;s zijn in zekere mate geïnspireerd door de reeds langs gekende <a href="https://en.wikipedia.org/wiki/Service-oriented_architecture">Service-Oriented Architecture</a> (SOA).</p>
<p style="text-align: justify;">We kunnen nu wel al iedereen gerust stellen: er bestaat geen &#8220;one size fits all&#8221;; alle groottes van services zullen nuttig zijn in de portfolio van applicaties, diensten en componenten die een IT-bedrijf zal ondersteunen. Deze heterogeniteit wordt ook vooropgesteld door Gartner en ze noemen dit de MultiGrained <a href="https://apifriends.com/2017/06/05/what-is-masa/">Mesh App and Service Architecture</a> (MG-MASA). Het belangrijkste daarbij is dat alle componenten hierin zo onafhankelijk mogelijk ontwikkelbaar zijn, terwijl ze toch vlot met elkaar kunnen communiceren en integreren.</p>
<p style="text-align: justify;">Met uitzondering van de dubieuze term &#8220;nanoservices&#8221;, zullen we van klein naar groot gaan: we zullen eerst grondig definiëren wat microservices nu eigenlijk zijn, alvorens de &#8220;grotere&#8221; services te bespreken.</p>
<h1 style="text-align: justify;">MicroServices: van Startup tot Web Scale speler</h1>
<p style="text-align: justify;">Microservices zijn onafhankelijke diensten met een sterk beperkte scope. Ze volgen rigoureus een aantal architecturale principes waardoor ze extreem wendbaar ( <strong><em>agile </em></strong>) zijn en ook heel flexibel schaalbaar. Ze zijn zo ontkoppeld mogelijk van andere applicaties en diensten, doch communiceren er ook mee. Deze schijnbare tegenstrijdigheid wordt doorgaans opgevangen door een <a href="/het-event-als-leidend-voorwerp-in-software-engineering/">Event-Driven Architecture</a>, dewelke losgekoppelde communicatie in gedistribueerde systemen ondersteunt.</p>
<div style="width: 300px; display: block; align: right; vertical-align: top; float: right; border: 1px solid #ddd; margin: 4px 0 5px 10px; padding: 5px 5px 0px 5px; background-color: #eee;">
<p><strong><em>Definitie: MicroService</em></strong></p>
<p style="text-align: justify;">Microservices zijn sterk ingekapselde, losgekoppelde, onafhankelijk ontplooibare en schaalbare applicatiecomponenten met een sterk beperkte scope. De microservices architectuur is gebaseerd op een combinatie van SOA en DDD en heeft drie belangrijke objectieven: wendbaarheid bij de ontwik-keling, flexibiliteit bij de uitrol en precieze schaalbaarheid.</p>
</div>
<p style="text-align: justify;">De beperkte scope en bijgevolg doorgaans kleinere codebase is ook voor een stuk wat een microservice zo wendbaar maakt: ze kunnen door een klein devops team worden ontwikkeld en onderhouden en meermaals daags opnieuw uitgerold worden met veranderende features. Een grote applicatie die aldus ondersteund wordt door een groep van microservices, zal constant online blijven maar continu kleine veranderingen ondergaan en dus voortdurend evolueren. Op deze manier zorgt de microservices architectuur dus voor extreem door-gedreven <a href="https://en.wikipedia.org/wiki/Continuous_delivery">Continuous Delivery</a>. Andere aspecten van deze architectuur zijn het principe van &#8220;single responsability&#8221; (wat op hetzelfde neerkomt als de beperkte scope), extreme schaalbaarheid en &#8211; indien de microservice gepersisteerde data beheert, exclusieve toegang (= &#8220;eigenaarschap&#8221; of <em>ownership</em>) tot zijn database (of andere persistentie-oplossing), in het kader van de loskoppeling.</p>
<p style="text-align: justify;">Microservices zijn op de kaart gezet door toepassing bij een aantal grote en bekende bedrijven als <span class="fontstyle0">Twitter, </span><span class="fontstyle0">Airbnb, Disney, Dropbox, GE, Goldman Sachs, en uiteraard ook grote Cloud spelers  zoals Amazon en Google. M</span><span style="font-weight: 300; text-align: justify;">icroservices, volgens de strikte definitie, zijn echter bij veel middelgrote bedrijven nog zeldzaam, al evolueren sommige miniservices (zie verder) na een tijdje wel tot een groepje microservices, doordat aparte functionaliteiten worden afgesplitst.</span></p>
<div style="width: 375px; display: block; align: right; vertical-align: top; float: left; border: 1px solid #ddd; margin: 4px 10px 5px 0; padding: 5px 5px 0px 5px; background-color: #eee;">
<p><strong><em>&#8220;Reuse&#8221;: Een anti-patroon&nbsp;?</em></strong></p>
<p style="text-align: justify;">Hergebruik wordt vaak gezien als de heilige graal van ontwikkeling: alles wat we reeds bouwden, zouden we moeten kunnen hergebruiken indien de functionaliteit voorkomt in iets anders dat we gaan bouwen.</p>
<p style="text-align: justify;">We moeten echter goed gaan opletten op welk niveau we gaan hergebruiken, zeker als we met de architectuur richting microservices evolueren. Vermits deze zo onafhankelijk mogelijk van elkaar moeten zijn, kan het <strong>soms contraproductief</strong> zijn <strong>om code te gaan hergebruiken tussen meerdere microservices</strong>. Dergelijk hergebruik creëert afhankelijkheden en verplichtingen die de wendbaarheid van een microservice doen afnemen.</p>
<p style="text-align: justify;">Waar vinden we dan wel nog <strong>herbruikbaarheid</strong>? <strong>Op het niveau van de APIs</strong>. Deze dienen te worden behandeld als een volwaardig eindproduct, dat kan worden gebruikt in tal van andere toepassingen en eventueel zelfs extra-muros.</p>
</div>
<p style="text-align: justify;"><span style="font-weight: 300; text-align: justify;">Ze worden qua aangeboden functionaliteit opzettelijk en strikt beperkt gehouden: normaal gezien wordt er slechts één specifieke feature ondersteund, of één bounded context binnen een domein (voor meer info over deze term, kijk naar </span><a style="font-weight: 300; text-align: justify;" href="https://en.wikipedia.org/wiki/Domain-driven_design">Domain Driven Design</a><span style="font-weight: 300; text-align: justify;"> (DDD)). </span>Doordat ze zo klein zijn en slechts één functionaliteit hebben, en apart uitrolbaar zijn, vormen microservices dus de ultieme vorm van flexibele schaalbaarheid. Een applicatie bestaande uit vele microservices kan optimaal gebruik maken van beschikbare resources: elke component die iets meer gebruikt wordt dan een andere, kan apart opgeschaald worden. Componenten die minder vaak nodig zijn, worden omlaag geschaald.</p>
<p style="text-align: justify;">De onafhankelijkheid van een microservice beperkt zich best niet tot fysiek afzonderlijke deployments. Ook gedeelde libraries kunnen namelijk worden beschouwd als een te grote afhankelijkheid tussen verschillende microservices. Op deze manier wordt hergebruik soms een anti-patroon (&#8220;anti-pattern&#8221;). Het gaat dan natuurlijk wel om de code die het domein implementeert, er is weinig op tegen om utilitaire bibliotheken, zoals een logging raamwerk, te hergebruiken in meerdere microservices.</p>
<p style="text-align: justify;">Microservices vinden we dan ook vooral terug bij bedrijven die op grote schaal (&#8220;web scale&#8221;) actief zijn, en dusdanig grote volumes moeten ondersteunen dat elke uitgespaarde percent benodigde resources een enorme kostenreductie tot gevolg heeft. We denken dan aan grote mediaspelers als Netflix, winkels als Amazon en Zalando, en uiteraard ook de Twitters, Facebooks en Googles van deze tijd.</p>
<div style="width: 475px; display: block; align: right; vertical-align: top; float: center; border: 1px solid #ddd; margin: 0 auto; padding: 5px; background-color: #eee;">
<p><strong><em>MicroServices: een andere &#8220;ph-waarde&#8221;: van ACID naar BASE</em></strong></p>
<p style="text-align: justify;">In de wereld van transacties is het ACID-model reeds lang ingeburgerd. Het stelt voorwaarden waaraan transacties moeten voldoen: A<span class="fontstyle0">tomicity, Consistency, Isolation and Durability. Dit komt erop neer dat de gegevens ten allen tijde overal overeenkomen, correct zijn, goed bewaard worden, nooit verloren kunnen gaan, etc.</span></p>
<p style="text-align: justify;">Voor gedistribueerde systemen is dit echter moeilijk, omdat deze sterke consistentie inhoudt dat men (voor de zelfde prijs) op minstens één van twee andere vlakken zal moeten inbinden: beschikbaarheid of partition tolerance (tolerantie voor netwerkfalen tussen de componenten). Microservices hebben hier per definitie last van, vanwege hun gedistribueerde natuur. Dit principe noemt men het <a href="/99-9-availability-fundamenteel-anders/">CAP-theorema</a>.</p>
<p style="text-align: justify;"><span class="fontstyle0">Bij gebruik van deze architectuur raadt men dan ook een alternatief aan: BASE. Dit wil zeggen: B</span><span class="fontstyle0">asically Available, Soft state, Eventually consistent. In dit model geeft men een stuk consistentie op om het geheel beschikbaarder en schaalbaarder te kunnen maken.</span></p>
<p style="text-align: justify;"><span class="fontstyle0">Puur technisch is het echt niet altijd gemakkelijk om met eventual consistency om te gaan; men zal dit model eerder moeten doortrekken op business niveau. Een aanpak gebaseerd op (business) Events zal doorgaans nauwer aansluiten bij dit model.</span></p>
</div>
<p style="text-align: justify;">Maar doordat het een nieuwe, moderne manier van ontwikkelen is, zijn microservices ook enorm populair bij startups. Deze hebben vaak het voordeel dat ze van nul kunnen beginnen met hun technologie, zonder enige legacy, en dat ze met kleine teams en een frisse bedrijfscultuur werken. <strong>Een Devops en Agile cultuur zijn namelijk sterke vereisten om microservices te kunnen ontwikkelen</strong>; hun architectuur verschuift namelijk de complexiteit weg van de binnenkant van een monoliet, maar recht naar de onderlinge interacties tussen vele (gedistribueerde) applicatiecomponten. Het voordeel  van microservices voor de startups is weliswaar dat ze op technologisch vlak een stuk robuuster zijn bij eventuele plotse groei, en ze de wendbaarheid ook goed kunnen gebruiken om snel in te spelen op marktopportuniteiten (er zijn reducties in ontwikkelingstijd tot 75% geschat).</p>
<h2 style="padding-left: 30px;"><em>APIs en Microservices</em></h2>
<p style="text-align: justify;">Microservices worden vaak beschouwd als de ideale manier om een <a href="/data-centric-it-met-rest/">API</a> te implementeren. Dit is inderdaad een goede werkwijze, maar dan met één hele belangrijke caveat: de onafhankelijkheid van de microservice moet gewaarborgd blijven. Het scheiden van een<span class="fontstyle0"> API en zijn implementatie is een fundamenteel principe bij SOA, dat nog belangrijker wordt in de context van de extreme vereisten die aan een microservices architectuur worden gesteld.</span></p>
<p style="text-align: justify;">Een API moet behandeld worden als een product. Geregeld worden APIs namelijk naar buiten toe opengesteld (en soms zelfs effectief gemonetariseerd), en op zijn minst dienen ze als interface naar andere software componenten (en dus andere ontwikkelteams) toe. Ze hebben dus nood aan een rigoureus change management.</p>
<p><figure id="attachment_11196" aria-describedby="caption-attachment-11196" style="width: 938px" class="wp-caption aligncenter"><a href="/wp-content/uploads/2017/11/MSA-example.png"><img loading="lazy" decoding="async" class="size-full wp-image-11196" src="/wp-content/uploads/2017/11/MSA-example.png" alt="" width="938" height="558" srcset="https://www.smalsresearch.be/wp-content/uploads/2017/11/MSA-example.png 938w, https://www.smalsresearch.be/wp-content/uploads/2017/11/MSA-example-300x178.png 300w, https://www.smalsresearch.be/wp-content/uploads/2017/11/MSA-example-768x457.png 768w" sizes="auto, (max-width: 938px) 100vw, 938px" /></a><figcaption id="caption-attachment-11196" class="wp-caption-text">Een voorbeeld van een Microservices architectuur, waarbij een API wordt aangeboden aan de buitenwereld.</figcaption></figure></p>
<p style="text-align: justify;">De microservices daarentegen moeten snel kunnen evolueren en aangepast kunnen worden. Soms worden ze zelfs volledig vervangen (ze zijn <em>disposable</em>: het verlies blijft beperkt doordat ze kleiner zijn). Sowieso zal één microservice ook nooit een volledige API implementeren (tenzij als het echt om een miniscuul klein product zou gaan): achter de API bevindt zich doorgaans een hele batterij van componenten, waarbij verschillende microservices de effectieve business logica zullen uitvoeren. Andere componenten zijn bijvoorbeeld een Event bus, maar ook en vooral een API bemiddelingstool (&#8220;mediation&#8221;), die ervoor zal zorgen dat de calls naar de API bij de correcte afhandeling terecht komen, en op die manier de microservice loskoppelen van de ondersteunde API. Deze tools zijn doorgaans vervat binnen de context van een API Gateway of API Management suite.</p>
<h1 style="text-align: justify;">De Pragmatische Aanpak: MiniServices</h1>
<p style="text-align: justify;">De term &#8220;microservice&#8221; wordt vaak misbruikt om eender welke kleine en herbruikbare dienst te benoemen. Maar zoals we hierboven zagen, voldoet dit nog lang niet aan de eigenlijke definitie, en is het ook zo dat een microservice zijn eigen API best niet zelf publiceert.</p>
<p style="text-align: justify;">De categorie die dan ook door vele &#8220;enterprise niveau&#8221; bedrijven het vaakst wordt toegepast, is eigenlijk de <em>miniservice</em>, ook al zijn deze bedrijven snel om te zeggen dat ze een &#8220;microservices architectuur&#8221; gebruiken. De architecturen lijken dan ook wel enigszins op elkaar en enkel de grootte en scope (en het uiteindelijke doel) verschillen hier nog.</p>
<p style="text-align: justify;">Miniservices implementeren geen volledige applicatie, en zullen normaal gezien ook slechts een stukje van een extern gerichte API invullen. Ze focussen zich op de functionaliteiten verband houdende met een bepaald subdomein in de applicatie. Wanneer we de principes van Domain Driven Design (DDD) volgen: een miniservice kan een volledig domein implementeren, maar eventueel ook een niet al te kleine &#8220;bounded context&#8221;, of alles wat ertussen ligt.</p>
<p style="text-align: justify;">Miniservices zijn onafhankelijk van elkaar te ontwikkelen en uit te rollen, waardoor er een flexibiliteit ontstaat: doordat men werkt met kleinere componenten die losjes gekoppeld zijn en die men daardoor apart kan ontwikkelen en laten evolueren, kan men iets sneller de functionaliteiten veranderen via een meer agile ontwikkelingsmethode, en men kan dus sneller op de bal spelen. Hierdoor kan men beter ten dienste staan van de business, die sneller zijn product kan laten aanpassen aan veranderende marktomstandigheden. Dit komt dus neer op een afgezwakte versie van de vereisten voor microservices.</p>
<p style="text-align: justify;">Wat data betreft, heeft men opties: in sommige gevallen kan men ervoor opteren om de database die onder een miniservice staat, nog bruikbaar te houden voor andere applicaties en diensten; soms is dit gewoon gemakkelijker en efficiënter dan de data via de API bloot te stellen, of op een moderne gedistribueerde manier te verspreiden zoals dit bij microservices gebeurt. Men moet hier echter mee oppassen en het beperken, want hierdoor creëert men quasi onherroepelijk afhankelijkheden. Beter is het om wat de data betreft toch eerder richting microservices architectuur te evolueren en de miniservice exclusieve toegang tot zijn data te geven.</p>
<p style="text-align: justify;">Volgens een schatting van <a href="https://www.gartner.com/doc/3615120/innovation-insight-miniservices">Gartner</a> zal tegen 2019 90% van de organisaties het microservices paradigma te disruptief vinden en eerder gebruik maken van miniservices.</p>
<p style="text-align: justify;">Er zijn, ten slotte, nog een aantal andere alternatieven voor een microservices aanpak, naast miniservices. Zo bestaan er <a href="/as-a-service-een-waaier-aan-mogelijkheden/">PaaS platformen</a> waarbij er sterk visueel kan worden ontwikkeld (met zogenaamde &#8220;zero coding&#8221;) en men op die manier de productiviteit kan laten stijgen. En voor het implementeren van business processen kan men nog gebruik maken van <a href="/case-management-oude-software-in-een-nieuwe-verpakking/">BPMS suites</a>, die ook hier vaak een sterke automatisatie toelaten op een meer grafische manier.</p>
<h1 style="text-align: justify;">Old School: de MacroService</h1>
<p style="text-align: justify;">Macroservices representeren de traditionele SOA aanpak, die nu sterk in vraag wordt gesteld door de IT industrie. Via een macroservice brengt men een volledige applicatie of dienst online, in één grote deployment; deze ondersteunt dan een typische request/response API. Het woord service kan dan in hoofdzaak worden aangewend doordat men de applicatie of dienst heeft ge-&#8220;service enabled&#8221;. Er wordt m.a.w. een SOAP of (beter!) een REST API aangeboden aan de buitenwereld om met de macroservice te interageren. Vaak is het ook zo dat deze applicatie bovenop een database gebouwd wordt, via dewelke nog wordt geïntegreerd met andere toepassingen.</p>
<p style="text-align: justify;">Momenteel is het sterk afgeraden om op deze manier een nieuwe applicatie op te bouwen, maar deze systemen hebben echter wel nog af en toe hun nut! Vele bedrijven hebben namelijk een bepaald arsenaal aan zogenaamde &#8220;legacy&#8221; toepassingen, die vaak nog belangrijke taken verrichten, en die te groot en te complex (en dus te duur) zijn geworden om ze volledig te vervangen door een moderne variant die dezelfde kernfunctionaliteit encapsuleert. Wat men dan op z&#8217;n minst kan doen om deze applicaties beter te kunnen integreren met de nieuwere generatie componenten, is ze te &#8220;service enablen&#8221;. Dit betekent dat men er een laag rond bouwt die een moderne (REST) API zal aanbieden waarmee andere toepassingen dan gemakkelijker verbinding kunnen maken. De laag zal ervoor zorgen dat de buitenwereld niets hoeft te merken van de soms rare zaken die met de legacy toepassing kunnen misgaan, of van de esoterische programmeertalen en protocols die erin worden gebruikt.</p>
<p style="text-align: justify;">Let wel dat er steeds moet worden afgewogen om zulke applicaties toch niet te re-engineeren. Wanneer het echt om de core business van een bedrijf gaat, en men wil kunnen inspelen op b.v. een veranderende markt (m.a.w. wanneer men wendbaarder, meer <em>agile</em>, wil zijn), kan het op langere termijn soms voordeliger zijn om ze te vervangen door een meer op microservices geïnspireerde architectuur. Het gebruik van MacroServices is eerder geschikt voor applicaties die minder vaak veranderingen dienen te ondergaan, maar die wel via een API moeten kunnen worden aangesproken. Soms kan het ook gaan om aangekochte software, die dus inherent niet onder de eigen controle zit en niet kan ge-reëngineered worden.</p>
<p><a href="/wp-content/uploads/2017/11/granulariteit.png"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-11195" src="/wp-content/uploads/2017/11/granulariteit.png" alt="" width="913" height="439" srcset="https://www.smalsresearch.be/wp-content/uploads/2017/11/granulariteit.png 913w, https://www.smalsresearch.be/wp-content/uploads/2017/11/granulariteit-300x144.png 300w, https://www.smalsresearch.be/wp-content/uploads/2017/11/granulariteit-768x369.png 768w" sizes="auto, (max-width: 913px) 100vw, 913px" /></a></p>
<h1 style="text-align: justify;">De Toekomst is hier: NanoServices</h1>
<p style="text-align: justify;">NanoServices kan twee zaken betekenen. Enerzijds is het een door sommige mensen aangewende term om op een anti-patroon bij het bouwen van microservices te duiden: namelijk een <a href="https://dzone.com/articles/soa-anti-pattern-nanoservices">te sterke beperking van de scope</a>, op een manier die zinloos is. Het komt er dus op neer dat men goed moet nadenken over de bounded context en het te verwachten aparte gebruik van de diensten die deel uitmaken van een applicatie.</p>
<p style="text-align: justify;">Anderzijds kan men de term ook officieus gebruiken als bijnaam voor de zogenaamde Serverless diensten, of nog <a href="https://en.wikipedia.org/wiki/Function_as_a_service">Function Platform as a Service</a> (FPaaS). Via deze platformen kan men hele kleine stukjes code uitrollen zonder zich iets te moeten aantrekken van onderliggende infrastructuur, en deze aan te bieden via een kleine API. De granulariteit van de manier van ontplooien zorgt er daarbij voor dat men vaak nog kleiner kan gaan dan bij microservices. Uiteraard moet men erover blijven waken dat het zin blijft hebben om de functionaliteit zodanig in stukjes te kappen, wil men niet in het gelijknamig benoemde anti-pattern terechtkomen.</p>
<p style="text-align: justify;"><a href="https://martinfowler.com/articles/serverless.html">Serverless Architecture</a> maakt momenteel grote furore in de public cloud en er zijn ook al enkele open source oplossingen om een dergelijk platform in het eigen datacenter op te zetten.</p>
<h1 style="text-align: justify;">Besluit: Wat moeten we nu Bouwen?</h1>
<p style="text-align: justify;"><strong><em>De microservices architectuur is een zeer goede blauwdruk voor software ontwikkeling</em></strong>. De voordelen van wendbaarheid en flexibiliteit zijn een must voor bedrijven die goed willen kunnen inspelen op de markt en de klant, en een robuuste portfolio aan herbruikbare services willen uitbouwen.</p>
<p style="text-align: justify;">De vereisten om aan échte microservices ontwikkeling te doen zijn echter erg hoog, en het is niet altijd noodzakelijk om zulke extreme flexibiliteit en schaalbaarheid te behalen. Vaak is het voldoende om de microservices architectuur eerder benaderend na te streven via het bouwen van zogenaamde <strong><em>miniservices. In de meeste gevallen is dit dan ook de aangewezen manier van werken</em></strong>.</p>
<p style="text-align: justify;">Wanneer legacy toepassingen moeten worden ontsloten en er geen grote nood is aan het wendbaarder maken van deze applicaties, maar wel een ontsluiting via een goede API, dan kan het voldoende zijn om een services laag rond deze applicaties te bouwen en er op die manier een zogenaamde macroservice van te maken, die vanaf dan vlot mee kan integreren met de rest van de portfolio. Denk echter goed na of toekomstige wendbaarheid en flexibiliteit echt wel van minder belang zijn, alvorens dergelijke technische schuld (technical debt) te betonneren.</p>
<p style="text-align: justify;">NanoServices, ten slotte, indien het niet om het anti-patroon gaat, zijn zeker iets waar men mee mag beginnen experimenteren. Het voordeel om zich niets meer van infrastructuur te hoeven aan te trekken en de beschikbaarheid en schaalbaarheid op een quasi magische manier cadeau te krijgen, is niet te onderschatten. In een toekomstige blog wordt er zeker nog teruggekomen op deze Serverless Architectures.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Van Chipkaart naar Smartphone naar&#8230; Arm?</title>
		<link>https://www.smalsresearch.be/van-chipkaart-naar-smartphone-naar-arm/</link>
					<comments>https://www.smalsresearch.be/van-chipkaart-naar-smartphone-naar-arm/#comments</comments>
		
		<dc:creator><![CDATA[Koen Vanderkimpen]]></dc:creator>
		<pubDate>Tue, 20 Sep 2016 08:01:01 +0000</pubDate>
				<category><![CDATA[[NL]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[architecture]]></category>
		<category><![CDATA[cloud computing]]></category>
		<category><![CDATA[Data Integration]]></category>
		<category><![CDATA[egov]]></category>
		<category><![CDATA[hardware]]></category>
		<category><![CDATA[IoT]]></category>
		<category><![CDATA[microservices]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[onlyonce]]></category>
		<category><![CDATA[open data]]></category>
		<category><![CDATA[Privacy]]></category>
		<category><![CDATA[rest]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[smartcard]]></category>
		<category><![CDATA[software design]]></category>
		<category><![CDATA[software engineering]]></category>
		<category><![CDATA[Web 2.0]]></category>
		<guid isPermaLink="false">/?p=9881</guid>

					<description><![CDATA[Er was eens&#8230; een metrorit. En voor metroritten heb je tegenwoordig een MOBIB-kaart nodig. Dit deed me terugdenken aan het verhaal van de smartcards, en hoe we er veel te veel nodig hebben&#8230; Bij deze dan het lang&#160;beloofde&#160;derde deel van dat verhaal. Over Metro- en Treinkaarten Onlangs moest ik na lange tijd nog eens de [&#8230;]]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image alignleft"><a href="/wp-content/uploads/2016/09/evolution.jpg"><img loading="lazy" decoding="async" width="150" height="150" src="/wp-content/uploads/2016/09/evolution-150x150.jpg" alt="evolution" class="wp-image-9993"/></a></figure>



<p>Er was eens&#8230; een metrorit. En voor metroritten heb je tegenwoordig een MOBIB-kaart nodig. Dit deed me terugdenken aan het verhaal van de smartcards, en hoe we er veel te veel nodig hebben&#8230; Bij deze dan het lang&nbsp;beloofde&nbsp;derde deel van dat verhaal.</p>



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



<h2 class="wp-block-heading">Over Metro- en Treinkaarten</h2>



<p>Onlangs moest ik na lange tijd nog eens de metro nemen. Ik wist dat mijn papieren kaartje met magneetstrip ondertussen niet meer geldig zou zijn: de overschakeling naar <a href="https://www.stib-mivb.be/mobib.html?l=en">MOBIB</a>&nbsp;is nu volledig doorgevoerd. De MOBIB-kaart is RFID technologie, waardoor je ze kan gebruiken door ze gewoon tegen een kaartlezer tegen te houden (je hoeft ze nergens in te steken). Meer over deze technologie kan je terugvinden in één van onze techno&#8217;s: <a href="/publications/document/?docid=86">Het ABC van RFID</a>.</p>



<p>Nu, ik heb reeds een treinabonnement, en ook dit staat op een MOBIB-kaart&#8230; van de NMBS. Ik moest er dus achter zien te komen of ik deze ook voor de metro kon gebruiken. Na wat zoekwerk, zag ik dat ik online een <a href="https://www.stib-mivb.be/mystib/Account/Register?l=en">account kon aanmaken bij de MIVB</a> en dat ik een bestaande MOBIB-kaart kon koppelen aan mijn account. Wanneer ik dit echter probeerde, wist het systeem mij te vertellen dat mijn kaart niet gekend was, maar dat dit wel het geval zou zijn indien ik deze eerst kon opladen via één van de <a href="https://www.stib-mivb.be/points-de-vente-verkooppunten.html?l=en&amp;news_rid=/STIB-MIVB/INTERNET/ACTUS/2007-06/WEB_Article_1181575177670.xml">GO-machines</a> in de metrostations.</p>



<figure class="wp-block-image aligncenter"><a href="/wp-content/uploads/2016/09/kaarttoevoegen.png"><img loading="lazy" decoding="async" width="905" height="399" src="/wp-content/uploads/2016/09/kaarttoevoegen.png" alt="kaarttoevoegen" class="wp-image-9985" srcset="https://www.smalsresearch.be/wp-content/uploads/2016/09/kaarttoevoegen.png 905w, https://www.smalsresearch.be/wp-content/uploads/2016/09/kaarttoevoegen-300x132.png 300w, https://www.smalsresearch.be/wp-content/uploads/2016/09/kaarttoevoegen-768x339.png 768w" sizes="auto, (max-width: 905px) 100vw, 905px" /></a></figure>



<p></p>



<p>Zo gezegd zo gedaan, en &#8211; wonder boven wonder? &#8211; dit werkte inderdaad zoals aangegeven: ik kon mijn NMBS-kaart gebruiken als houder voor het saldo van mijn metroritten, en ik kon deze kaart daarna ook effectief koppelen aan mijn online profiel bij MIVB. (Eén mankement: het resterend saldo aan ritten is niet zichtbaar; maar misschien is dit ook voor de eigen kaarten van MIVB geen feature? &#8211; graag een comment indien iemand dit weet!)</p>



<figure class="wp-block-image aligncenter"><a href="/wp-content/uploads/2016/09/kaarttoegevoegd1.png"><img loading="lazy" decoding="async" width="776" height="501" src="/wp-content/uploads/2016/09/kaarttoegevoegd1.png" alt="kaarttoegevoegd1" class="wp-image-9991" srcset="https://www.smalsresearch.be/wp-content/uploads/2016/09/kaarttoegevoegd1.png 776w, https://www.smalsresearch.be/wp-content/uploads/2016/09/kaarttoegevoegd1-300x194.png 300w, https://www.smalsresearch.be/wp-content/uploads/2016/09/kaarttoegevoegd1-768x496.png 768w" sizes="auto, (max-width: 776px) 100vw, 776px" /></a></figure>



<p></p>



<p>Wat leren we nu uit dit verhaal?</p>



<ul class="wp-block-list">
<li>Ten eerste, de technologische mogelijkheden om het probleem van het <a href="/help-mijn-portefeuille-is-te-dik/">teveel aan kaarten in mijn portefeuille</a> op te lossen, zijn reeds duidelijk aanwezig, maar, gezien het aantal kaarten dat ik nog nodig heb, is er nog geen verregaande implementatie gebeurd (zo is mijn abonnement bij De Lijn, verkregen via NMBS, nog steeds een stukje papier, en een koppeling met bijvoorbeeld de <a href="https://eid.belgium.be/en">Belgische eID</a> is nog steeds beperkt tot de occasionele <a href="https://www.belgianrail.be/en/customer-service/where-to-buy-my-tickets/buy-ticket-mobile.aspx">online aankoop</a> van een treinticket). Conclusie: nog steeds geen <a href="/one-card-to-rule-them-all/">one card to rule them all&#8230;</a></li>



<li>Ten tweede: de netwerken van MIVB en NMBS zijn voorlopig nog onvoldoende geïntegreerd om reeds bij de aanmaak van een nieuwe kaart bij één firma, rechtstreeks ook de nodige gegevens te versturen aan de andere. Op zich is dit soort integratie misschien nogal veeleisend, maar in deze nieuwe wereld van de IT, met zijn <a href="/disruptie-in-de-cloud-stack-caas/">Cloud</a>, zijn <a href="/van-n-tier-naar-microservices/">microservices</a>, en vooral, zijn <a href="/data-centric-it-met-rest/">API economy</a>, zijn er toch wel een aantal <a href="/het-event-als-leidend-voorwerp-in-software-engineering/">architecturen</a> te bedenken waarin dit geen probleem zou mogen zijn. Het &#8220;<a href="https://joinup.ec.europa.eu/event/egovernment-and-reduction-administrative-burden-applying-%C3%A2%E2%82%AC%CB%9Conce-only%C3%A2%E2%82%AC%E2%84%A2-principle">only once principe</a>&#8221; is echter vaak meer een verhaal van politiek en economie, dan van technologie.</li>
</ul>



<h2 class="wp-block-heading">&#8220;Card Management as a Service&#8221;</h2>



<figure class="wp-block-image alignright"><a href="/wp-content/uploads/2016/09/wernervoegls.jpg"><img loading="lazy" decoding="async" width="300" height="225" src="/wp-content/uploads/2016/09/wernervoegls-300x225.jpg" alt="wernervoegls" class="wp-image-9986" srcset="https://www.smalsresearch.be/wp-content/uploads/2016/09/wernervoegls-300x225.jpg 300w, https://www.smalsresearch.be/wp-content/uploads/2016/09/wernervoegls.jpg 638w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a></figure>



<p>Ik zou hier graag reeds even vooruitblikken op een toekomstige blog, waarin ik de voordelen van een gescheiden beheer van gegevensnetwerken versus er van gebruik makende&nbsp;toepassingen wil toelichten: Stel dat we één instelling hadden die het beheer van de kaarten en de&nbsp;ermee gepaard gaande gegevens, netwerken en basisdiensten op zich nam, en dat de andere bedrijven, zoals de vervoersmaatschappijen in kwestie, van deze diensten gebruik maakten. Dit zou ervoor zorgen dat alles wat met kaarten te maken had, efficiënter zou kunnen worden gemaakt wegens schaalvoordelen, én dat de vervoersmaatschappijen zelf deze verantwoordelijkheid niet meer hoefden te dragen. Dit is eigenlijk precies één van de belangrijke verwezenlijkingen van <a href="/cloud-metaforen-elektriciteit-goud/">Cloud</a>, en, meer in het bijzonder, het &#8220;<a href="/as-a-service-een-waaier-aan-mogelijkheden/">as a Service</a>&#8221; verhaal, maar dan toegepast op <a href="/escroqueries-carte-bancaire/">chipkaarten</a>. Daarnaast kan men het ook bekijken in een microservices en API context (&#8220;you build it, you run&nbsp;it&#8221;).</p>



<p>Hierover dus later meer.&nbsp;Waar ik het nu verder over wil hebben is de toekomst&#8230;</p>



<h2 class="wp-block-heading">De Nabije Toekomst?</h2>



<p>Vandaag is het reeds mogelijk om met je <a href="/een-smartphone-of-tablet-als-eindejaarscadeau/">smartphone</a> vervoersbewijzen aan te kopen, betalingen te doen, ja, zelfs jezelf te <a href="/kan-ik-met-csam-mobiel-authenticeren/">identificeren voor gebruik van overheidstoepassingen</a>. Een toekomst waarin we geen kaarten meer nodig hebben, maar waarin deze volledig zijn vervangen door de smartphone, is dus zeker technisch realiseerbaar, en op lange termijn misschien zelfs realistisch. Het belangrijkste probleem hierbij is er één dat slechts langzaamaan kan worden opgelost: de logistiek van het on-boarden van alles en iedereen die nu nog met kaarten werkt, en van alles en iedereen die nu nog geen smartphone heeft. In een nog verdere toekomst zullen we misschien zelfs de portefeuille in zijn geheel kunnen afschaffen, indien we dit ook met <a href="https://deredactie.be/cm/vrtnieuws/economie/1.2558162">het systeem van cash geld</a> zouden doen!</p>



<h2 class="wp-block-heading">Science Fiction</h2>



<p>Wat als we dan nog eens een paar decennia verder in de toekomst kijken? We zien reeds nu zaken opduiken als <a href="/biometrie-eindelijk-gedaan-met-paswoorden-onthouden/">bio-authentication</a>, waarbij we onze vingerafdrukken, stem, gezicht, of zelfs <a href="/gedragsbiometrie-als-basis-voor-impliciete-authenticatie/">context</a> gebruiken om te authenticeren. Daarnaast doet men ook gericht onderzoek naar nanotechnologie, robotica, <a href="/watson-revisited/">artificiële intelligentie</a>, <a href="/er-zit-een-hacker-in-mijn-diepvries/">Internet of Things</a>, &#8230; Allemaal zaken die ervoor zorgen dat technologie en ons lichaam steeds dichter bij elkaar komen en uiteindelijk zelfs kunnen worden&nbsp;<a href="https://en.wikipedia.org/wiki/Biomechatronics">samengevoegd</a>.</p>



<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="The Cicret Bracelet (Concept video)" width="500" height="281" src="https://www.youtube.com/embed/9J7GpVQCfms?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>



<p>Uiteindelijk zou het dan mogelijk worden dat de smartphone wordt vervangen door een scherm op de huid van onze <strong><em>arm </em></strong><em>(zie filmpje hierboven voor wat binnenkort al kan!)</em>, met alle nodige technologie netjes verborgen aan de binnenkant van ons lichaam! Sterker nog: het scherm zou evengoed virtueel voor onze ogen kunnen worden getoverd, dankzij technologie rechtstreeks in onze ogen of hersenen. Op die manier hebben we niets meer nodig: al het nodige dragen we steeds met ons mee, zoals we dat met ons lichaam doen. En onszelf identificeren om ons vervoersbewijs te <a href="https://1.bp.blogspot.com/-fZhj_ikcrdE/Tg99qyIMheI/AAAAAAAADN4/vNgts2y1qfc/s1600/These%2BArent%2BThe%2BDroids%2BYoure%2BLooking%2BFor%2B006.jpg">legitimiseren, doen we door eens te wuiven</a>.</p>



<p>Op zich een groot gemak, maar uiteraard is hier ook een duistere zijde aan verbonden: het zou wel eens heel moeilijk kunnen worden om &#8220;off-the-grid&#8221;, of &#8220;offline&#8221; te gaan, of om zonder al deze technologische snufjes te kunnen. Sterker nog: we zouden Big Brother scenario&#8217;s kunnen krijgen, of een regelrecht doembeeld, zoals in de film &#8220;<a href="https://www.imdb.com/title/tt1637688/">In Time</a>&#8220;.&nbsp;Maar goed: wat er met een technologie gedaan wordt, staat los van de technologie zelf (ook met een eenvoudige hamer kan je zowel bouwen als verwonden).</p>



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



<p>Er staan ons nog een aantal wonderlijke technologische evoluties&nbsp;te wachten, maar er blijft vooral nog veel werk aan de winkel wat betreft het vereenvoudigen van het leven van de gewone burger, met al zijn chipkaarten, zijn smartphone en zijn muntjes van twee eurocent, en van alle administratie die daarbij komt kijken. Samenwerking, integratie, en het zo breed mogelijk invoeren van het <em>only once principe</em>&nbsp;zijn de boodschap.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.smalsresearch.be/van-chipkaart-naar-smartphone-naar-arm/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>High Availability &#038; WC papier</title>
		<link>https://www.smalsresearch.be/high-availability-wc-papier/</link>
					<comments>https://www.smalsresearch.be/high-availability-wc-papier/#comments</comments>
		
		<dc:creator><![CDATA[Johan Loeckx]]></dc:creator>
		<pubDate>Wed, 10 Nov 2010 13:49:05 +0000</pubDate>
				<category><![CDATA[Blog post]]></category>
		<category><![CDATA[architecture]]></category>
		<category><![CDATA[data center]]></category>
		<category><![CDATA[eHealth]]></category>
		<category><![CDATA[High Availability]]></category>
		<category><![CDATA[software engineering]]></category>
		<guid isPermaLink="false">http://blogs.smals-mvm.be/research/?p=1368</guid>

					<description><![CDATA[Centraal in het debat rond High Availability staat het zogenaamde “CAP theorema” dat (grofweg) stelt dat niet alle systemen op elk ogenblik de meest up-to-date informatie kunnen bezitten als hoge beschikbaarheid vereist is. Hoewel dit op het eerste gezicht dramatisch lijkt, is dit in de praktijk niet het geval omdat &#8220;tijd&#8221; een verschillende betekenis heeft [&#8230;]]]></description>
										<content:encoded><![CDATA[<p style="text-align: justify;">Centraal in het debat rond High Availability staat het zogenaamde <a href="https://nl.wikipedia.org/wiki/CAP_theorema">“CAP theorema”</a> dat (grofweg) stelt dat <strong>niet alle systemen op elk ogenblik de meest up-to-date informatie kunnen bezitten als hoge beschikbaarheid vereist is.</strong></p>
<p style="text-align: justify;">Hoewel dit op het eerste gezicht dramatisch lijkt, is dit in de praktijk niet het geval omdat <strong>&#8220;tijd&#8221; een verschillende betekenis heeft in business context dan in IT context. </strong>Bekijken we het voorbeeld van een patiënt die een elektronisch voorschrift krijgt bij de dokter, en dan naar de apotheker gaat om zijn &#8220;bestelling&#8221; op te halen:</p>
<p style="text-align: justify;"><a href="/wp-content/uploads/2010/11/tijdslijnpatient-dokter-apotheker1.png"><img decoding="async" class="aligncenter size-medium wp-image-1377" title="tijdslijnpatient-dokter-apotheker" src="/wp-content/uploads/2010/11/tijdslijnpatient-dokter-apotheker1.png" alt="" width="95%" srcset="https://www.smalsresearch.be/wp-content/uploads/2010/11/tijdslijnpatient-dokter-apotheker1.png 1186w, https://www.smalsresearch.be/wp-content/uploads/2010/11/tijdslijnpatient-dokter-apotheker1-300x137.png 300w, https://www.smalsresearch.be/wp-content/uploads/2010/11/tijdslijnpatient-dokter-apotheker1-1024x467.png 1024w, https://www.smalsresearch.be/wp-content/uploads/2010/11/tijdslijnpatient-dokter-apotheker1-768x351.png 768w" sizes="(max-width: 1186px) 100vw, 1186px" /></a></p>
<p style="text-align: justify;">Hoewel 10 seconden in computertermen een eeuwigheid is, is dat in business context niet.  <strong> </strong>De kans dat een patiënt binnen 40 seconden na het voorschrijven, de dokter kan betalen en bij de apotheker geraakt is quasi-onbestaande.</p>
<p style="text-align: justify;">Het CAP theorema stelt bij dit voorbeeld dan ook geen problemen.  <strong>Deze deadlock situatie kan alleen opgelost worden door de business mee te betrekken. Om deze reden is het essentieel om High Availability reeds vanaf de requirements analyse in rekening te brengen. </strong></p>
<h2 style="text-align: justify;"><strong><span id="more-1368"></span></strong>De noodzakelijke evolutie naar &#8220;distributed systems&#8221;</h2>
<p style="text-align: justify;">Het CAP theorema zou omzeild kunnen worden (in theorie althans) door te evolueren naar één monolithisch systeem. Dit is echter geen oplossing omdat men dan het probleem verschuift naar binnen de grenzen van dit systeem.  In de moderne wereld waarbij online toepassingen door steeds meer mensen gebruikt worden, kan de nodige performantie immers vaak niet eens door één systeem geleverd worden.  <strong>Het lijkt er dus op dat we dus noodzakelijkerwijs evolueren naar gedistribueerde systemen</strong>. Redundantie is in dat geval een erg efficiënte manier om de beschikbaarheid te verhogen.</p>
<h2 style="text-align: justify;">Availability tijdens de requirements analyse</h2>
<p style="text-align: justify;">Het CAP theorema zal het ons dus moeilijk maken! Zoals reeds gezegd, kan men in de praktijk echter veel verbeteren door <strong>High Availability reeds vanaf de requirements analyse </strong>in rekening te brengen door:</p>
<ul>
<li>de <strong>levensduur en vluchtigheid van de gegevens in kaart te brengen</strong> (de 40s in bovenstaand voorbeeld) en</li>
<li>de eisen op vlak van <strong>beschikbaarheid te specificeren voor elke use-case</strong> in plaats van voor het volledige systeem.</li>
</ul>
<p style="text-align: justify;">Tijdens de architectuurfase kan men dan specifiek optimiseren naar deze niet-functionele beschikbaarheidsbehoeftes.</p>
<p style="text-align: justify;">
<h2>Beter vele kleintjes dan een paar grote</h2>
<p style="text-align: justify;">Het punt dat ik wil maken in deze post, is dat bij een redundante architectuur, de strategie van <em>vele kleintjes </em>vaak beter is dan een <em>paar grote</em>.  Bij een traditioneel actief-passief failover systeem behandelt één systeem alle aanvragen tenzij dit systeem uitvalt, waarbij het passief systeem actief wordt en haar taken overneemt.  In dit geval bevat elk apart deelsysteem de mogelijkheid om het volledige probleem &#8220;op te lossen&#8221; en <strong>het falen van een systeem is intrinsiek een incident</strong>.</p>
<p style="text-align: justify;">Stel daarentegen een gedistribueerd systeem voor waarbij 10 kleine, goedkope servers elk een deel van de taak op zich nemen en hierover voortdurend met elkaar communiceren.  Als er eentje uitvalt, zijn er nog 9 beschikbaar om de taken te herverdelen (de performantie zal wel wat afnemen).  <strong>Door de architectuur hierop ingesteld is, integreert een nieuw opgestart deelsysteem zich automatisch in het geheel.  Het </strong><strong>vervangen van zo&#8217;n deel-systeem wordt een standaard, dagdagelijkse onderhoudstaak</strong>, juist zoals het nemen van een backup.</p>
<h2>WC papier?</h2>
<p>De vergelijking die ik graag wil maken is het onderhoud van WC papier.  Laten we twee situaties vergelijken:</p>
<ul>
<li>er is één rol van 400 vellen geïnstalleerd</li>
<li>er zijn vier rollen van elk 100 vellen geïnstalleerd</li>
</ul>
<p style="text-align: justify;">Elke dag nagekeken wordt of de rol op is.  Indien nodig wordt de rol vervangen.  Bekijken we de grafiek van de hoeveelheid beschikbare wc papier in functie van de tijd:</p>
<p><a href="/wp-content/uploads/2010/11/HighAvailabilityWCs.png"><img decoding="async" class="aligncenter size-full wp-image-1389" title="HighAvailabilityWCs" src="/wp-content/uploads/2010/11/HighAvailabilityWCs.png" alt="" width="95%" srcset="https://www.smalsresearch.be/wp-content/uploads/2010/11/HighAvailabilityWCs.png 552w, https://www.smalsresearch.be/wp-content/uploads/2010/11/HighAvailabilityWCs-189x300.png 189w" sizes="(max-width: 552px) 100vw, 552px" /></a></p>
<p style="text-align: justify;">Zoals duidelijk op te maken valt uit dit simpele conceptuele voorbeeld, is er steeds WC papier beschikbaar indien men kiest voor kleinere deelsystemen. In de situatie waarbij men één rol van 400 vellen heeft, moet men ofwel kiezen voor &#8220;waste&#8221; (weggooien van wc papier) of voor &#8220;downtime&#8221; (de afwezigheid van wc-papier).  Deze conclusies kunnen formeel geabstraheerd worden naar andere systemen.</p>
<p style="text-align: justify;">Maar nu moet ik nog even mijn handen wassen&#8230;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.smalsresearch.be/high-availability-wc-papier/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
	</channel>
</rss>
