Deze tweede etappe begint in Dongen. Je wandelt langs het Wilhelminakanaal naar het noorden van Tilburg. Deze etappe heb ik gecombineerd met etappe 1 en ten hoogte van de Groenvenseweg waarbij de Coca cola fabriek te bus gepakt naar station Tilburg.
Dongen
We beginnen in Dongen. Dit is een Brabantse gemeente met ongeveer 25.000 inwoners, gelegen tussen Tilburg en Breda. Het is een typisch voorbeeld van een voormalig agrarisch dorp dat in de 20e eeuw is getransformeerd tot een moderne gemeente met verschillende industrieterreinen. Desondanks heeft Dongen nog steeds een landelijk karakter, met veel groene gebieden en historische bezienswaardigheden zoals de Sint Laurentiuskerk en het voormalige Raadhuis.
Ik vond het dorpje niet erg indrukkend wekkend. Wat opviel waren borden van gebouwen die allang waren afgebroken en geen enkel spoor meer van te zien was. Zo heeft er een een groot klooster gestaan tot 1978. Een sanatorium Overdonk die er tot 1997 heeft gestaan en een kapel en Lourdesgrot, die ook weg zijn.
Leerlooierijen
In 1891 waren er in Dongen 82 leerlooierijen actief. In 1982 waren er hier nog maar twee van over waarvan Fr. v.d. Assum Overlederfabriek. Zij looiden in het Heuvelpark. In de ernaast gelegen rivier de Dongen werden de huiden gehangen om de haren eraf te weken, waarna het vel werd geschraapt en het leer gelooid kon worden. Nu is er in het authentieke Heuvelpark nog een kleine leerlooierij in gebruik.
Wilhelminakanaal
Het Wilhelminakanaal is een belangrijk kanaal in het zuiden van Nederland, dat langs Dongen loopt. Het kanaal is 68 kilometer lang en het loopt vanuit de Zuid-Willemsvaart bij Laarbeek naar de Amer bij Geertruidenberg.
Conclusie
Ik vond het dorpje niet erg indrukkend wekkend, het stuk langs het kanaal was wel mooi en ik heb genoten van de zonsondergang.
Afstand & OV Tip:
Etappe 2a is 8,0 km en heb ik gelopen op 8 januari 2023 en heb deze gecombineerd met etappe 1. Ik ben gestopt bij Bushalte: “Dongen, Groenvenseweg”
In de serie van Hertogenpad gebruik ik de etappe verdeling van Wandelnet.Zie de overzichtspagina: Hertogenpad voor de andere wandelingen uit deze serie
Wandelen vanuit de voormalige garnizoens- en vestingstad Breda brengt je naar Boswachterij Dorst, een voormalig productiebos dat is omgevormd tot een open natuurgebied. Hier kun je Schotse Hooglanders tegenkomen voordat je aankomt in Dongen, met zijn historische schoenmakershuizen en voormalige leerlooierijen als eindpunt.
Breda
Deze etappe beginnen we bij het station van Breda en wandel je door het oude centrum van de stad. De Grote Kerk van Breda, ook bekend als de Onze-Lieve-Vrouwekerk, is een gotisch gebouw in het historische centrum van de stad. De kerk werd gebouwd in de 15e eeuw. De Grote Kerk heeft een rijke geschiedenis en heeft dienst gedaan als begraafplaats voor de leden van het Huis van Nassau, een van de belangrijkste adellijke families van Europa. Tegenwoordig wordt de kerk nog steeds gebruikt voor erediensten en worden er regelmatig concerten en tentoonstellingen gehouden. De kerk is 97 meter hoog.
Koepelgevangenis
De Koepelgevangenis in Breda is een gebouw dat dienst heeft gedaan als gevangenis van 1886 tot 2016. De gevangenis is vooral bekend om zijn opvallende dak, dat van ver te zien is en een herkenbaar onderdeel van de skyline van Breda vormt. Het gebouw heeft een lange geschiedenis en is in de loop der jaren meerdere malen verbouwd en gemoderniseerd. Op dit moment wonen er Oekraïners die hier vanwege de oorlog hier nu wonen.
Teteringse Heide
De Teteringse Heide is een uitgestrekt natuurgebied in de buurt van Breda, dat voornamelijk bestaat uit heide, bos en zandverstuivingen. Een bekend verhaal over deze plek is de Moord van de Teteringse Heide. Dit is een beruchte moordzaak die in 1992 plaatsvond op de Teteringse Heide. Bij deze moord werden drie mensen om het leven gebracht/ Na een jarenlang onderzoek werd een verdachte gearresteerd en veroordeeld voor de moorden. De zaak heeft nog steeds een grote impact op de betrokken families en heeft bijgedragen aan de beeldvorming van de Teteringse Heide als een plek met een duistere geschiedenis.
Boswachterij Dorst
De Boswachterij Dorst is een groot natuurgebied dat vroeger bekend stond als een productiebos, maar tegenwoordig is omgevormd tot een open natuurgebied met verschillende boomsoorten.
Het gerecht van Oosterhout
Vroeger hadden de heren van Oosterhout het recht om straffen uit te spreken, inclusief de zwaarste straffen voor zware misdaden. In de 14e eeuw kwam dit recht eerst bij de heer van Breda terecht en later bij de burgerlijke overheid van de Vrijheid van Oosterhout. De veroordeelden werden vaak op de Heuvel in het centrum terechtgesteld en daarna aan een galg buiten de bebouwde kom opgehangen. De galg stond in de buurt van de wegen van Oosterhout naar Gilze, van Oosterhout naar Rijen en de weg van Dongen naar Breda. In de 19e eeuw werden er onder het gerecht van Oosterhout geen doodstraffen meer uitgevoerd en verdween de noodzaak van een galg. De namen van percelen zoals ‘Stakenbosch’, ‘Mikkenbosch’ en ‘Galgenbosch’ herinneren nog steeds aan het bestaan van de galg.
Wilhelminakanaal
Het Wilhelminakanaal is een belangrijk kanaal in het zuiden van Nederland, dat langs Dongen loopt. Het kanaal is 68 kilometer lang en het loopt vanuit de Zuid-Willemsvaart bij Laarbeek naar de Amer bij Geertruidenberg.
Conclusie
Het is erg mooi om de binnenstad van Breda te zien en langs de koepelgevangenis te komen, vervolgens wandel je wel door wat buitenwijken die wat minder interessant zijn. Verder zijn de natuurgebieden Teteringse Heide en de bossen van Dorst erg mooi om door heen te wandelen.
Afstand & OV Tip:
Etappe 1 is 20,1 km en heb ik gelopen op 8 januari 2023 en heb deze gecombineerd met etappe 2a. Deze etappe begint op station Breda.
In de serie van Hertogenpad gebruik ik de etappe verdeling van Wandelnet. Zie de overzichtspagina: Hertogenpad voor de andere wandelingen uit deze serie
Het was dus de hoogste tijd om het tijdrovende proces van fotobeheer te optimaliseren. Ik kan erg van genieten om op pad te gaan en te fotograferen. Maar als ik dan thuiskom wordt het tijd om al die foto’s goed te organiseren. Dat taakje is typisch iets dat we uitstellen, maar het is wel leuk om de foto’s en ervaringen te delen. Voor dit proces heb ik een stuk software ontwikkeld en in deze blog vertel ik wat ik hier in 2022 zoal aan verbetert heb. Dit jaar begon het pas echt voor het project. De eerste blogpost over het project is een feit. Daarnaast is er ook een demo te bekijken op demo.qdraw.nl
12 releases gedaan in 2022
Waar heb ik het afgelopen jaar zoal aangewerkt? Zo ben ik bezig geweest met realtime updates vanuit het bestandssysteem zodat je altijd up-to-date bent! Een nieuwe type sortering toegevoegd in de lijst, schrijf eerst een tijdelijk bestand voordat er een bestand wordt weggeschreven, om corrupte bestanden te voorkomen. Een upgrade gedaan naar .NET 6 het framework van Microsoft. Configuratie toegevoegd om mappen buiten te sluiten bij het up-to-date houden van index. Notificaties houden we nu in een uniforme manier bij, ook als je even de verbinding bent verloren kun je de recente updates zo ophalen. Een upgrade gedaan van de front-end bibliotheek: React 17 naar 18 en de desktop-app bibliotheek: Electron meerdere keren geupgrade naar de laatste versie. De afhankelijkheid van Exiftool, om de metadata weg te schrijven is verminderd omdat deze al tijdens de build wordt toegevoegd. Serverside versie toegevoegd voor M1/M2 Macs, de desktop versie volgt nog op een later moment, daar loop ik tegen Gateway (beveiliging van Mac OS) issues aan. De Diskwatcher functionaliteit volledig herschreven zodat deze maximaal 20 seconde neemt om te controleren of er dubbele events zijn binnengekomen en deze er uit te filteren, dit levert een enorme performance winst op. Verder het vergelijken van de database en het bestandssysteem veranderd zodat deze een stuk sneller is dan voorheen. Dit alles gezorgd dat dit goed werkt en versie 0.5.0 uitgebracht. Daarna gewerkt aan betere documentatie, hier valt nog veel te winnen en het handmatig locaties toevoegen. Op naar een goed 2023!
What’s next?
De volgende functionaliteit die wordt toegevoegd is om te zorgen dat er altijd kleine versies van de afbeeldingen beschikbaar zijn, zodat je in het overzicht makkelijk de afbeeldingen kunt zien. Verder zijn er nog diverse milestones waar ideeën zijn om het project te verbeteren. Wil je meehelpen, bijdragen of een bijdrage doen dan wordt dat gewaardeerd.
In het centrum van Apeldoorn hadden ze bedacht om video’s te gaan projecten op een aantal gebouwen. Video projecties op gebouwen zijn een opvallende manier om kunst te presenteren in de stad Apeldoorn. Het idee was het een indrukwekkende visuele ervaring was, al was hier de uitwerking niet zo. Zo was het onderdeel van een evenement. Het idee was om de stad te verlevendigen en aantrekkelijker te maken voor bezoekers en inwoners. In de week voor kerst vond Wintersferen plaats in de Apeldoornse binnenstad.
In het centrum van Apeldoorn
Van dinsdag 20 tot en met vrijdag 23 december worden op zes panden in het centrum van Apeldoorn videobeelden geprojecteerd die een kijkje in de koninklijke geschiedenis van Apeldoorn bieden. Je kunt de videoprojecties dagelijks tussen 16.30 uur en 23.00 uur bewonderen bij Reisbureau van Werven, Coffeeshop de Bazar, Juwelier Royals, Nelson Schoenen, Van Uffelen Mode en CASA. Het was een rondje van 2 kilometer.
Niet erg bekend bij de inwoners
Door meerdere inwoners worden we gevraagd wat er aan de hand is in de binnenstad, met een camera val je toch iets meer op. We zijn op woensdagavond ook een van de weinigen die hier naar kwamen kijken. Verder zijn de video’s erg kort en repeterend en wordt er niet echt een verhaal verteld, het was iets met het koningshuis. Volgens de organisatie zou er ook iets van muziek maar dat was niet te vinden. Ik ben bang dat het er mooier op de foto’s uitziet dan dat het in het echt was, maar dat mag je zelf invullen.
Conclusie
Het is wel aardig uitgewerkt, maar er is nog wel wat te verbeteren qua ervaring. Op één plek hing de projector ook heel laag, daar kon je dus midden in het beeld gaan staan. Dus leuk geprobeerd maar het kan beter.
In deze blogpost ligt een case toe waar ik recent aan gewerkt hebt. Het is een technische blog waarin ik patronen bespreek en laat zien hoe we dit oplossen bij een groot geschaald systeem waar meerdere losstaande microservice-websites los van elkaar informatie verwerken en meerdere services domein overstijgend samenwerken. Het voorbeeld dat ik in deze blogpost gebruik is de case van een registratie proces binnen een microservice architectuur. In het eerste stuk van het artikel ligt ik de randvoorwaarden toe en daarna geef ik een praktisch voorbeeld.
Microservices
Microservices zijn een softwarearchitectuur waarbij een applicatie wordt opgebouwd uit kleine, zelfstandige services die elk een specifiek doel vervullen. Deze services communiceren met elkaar via een gestandaardiseerd interface, zoals een API. Dit stelt ontwikkelaars in staat om snel nieuwe functionaliteiten toe te voegen of bestaande te wijzigen, omdat elke service afzonderlijk kan worden ontwikkeld, getest en gedepolyed. Microservices bieden ook flexibiliteit en schaalbaarheid, omdat elke service afzonderlijk kan worden opgeschaald of bijgewerkt zonder de hele applicatie te hoeven aanpassen. Het gebruik van microservices is vooral geschikt voor grote, complexe systemen met veel veranderende vereisten.
Het antipatroon: Chatty microservices of monolithic microservices
Een antipatroon zijn chatty microservices. Dit zijn microservices die frequent communiceren met elkaar door middel van het sturen van veel kleine berichten, zoals HTTP API-aanvragen. Dit kan leiden tot vertragingen en inefficiënties, omdat elke aanvraag tijd kost om te verzenden en te verwerken, daarnaast loopt het proces vast als een service niet direct antwoord geeft. Bovendien kan het ook leiden tot extra foutgevoeligheid, omdat elke aanvraag een potentieel punt is waar iets mis kan gaan. In plaats van chatty microservices is het beter om microservices te ontwerpen die berichten uitwisselen via een servicebus. Daarnaast houden we een outbox-tabel bij om te voorkomen dat een service een bericht niet kan uitvoeren. Wat dit inhoud ga ik in deze blog uitleggen.
Wat is SAGA?
SAGA is een architectuur patroon dat wordt gebruikt om complexe transacties te behandelen die betrekking hebben op verschillende domeinen of systemen. Het patroon is gebaseerd op het idee dat elke transactie kan worden opgedeeld in een aantal kleinere stappen, waarbij elke stap een “compensatie” -stap heeft die kan worden uitgevoerd op het moment dat de transactie niet succesvol is. Dit maakt het mogelijk om transacties te verwerken die over verschillende domeinen of systemen gaan, zonder dat er consistentieproblemen optreden. SAGA is vooral nuttig voor grote, complexe systemen waarbij verschillende componenten uit het systeem benodigd zijn om de transactie te voltooien.
Wat is een servicebus?
Een servicebus is een softwarecomponent die wordt gebruikt om te communiceren tussen verschillende applicaties of systemen. Het stelt deze systemen in staat om berichten naar elkaar te sturen via een gestandaardiseerd protocol, zoals AMQP (Advanced Message Queuing Protocol). Een servicebus kan worden gebruikt om asynchrone communicatie tussen systemen te ondersteunen, wat kan helpen om de prestaties en schaalbaarheid van het systeem te verbeteren. Een bekend voorbeeld van een servicebus is RabbitMQ, een open source implementatie van AMQP. RabbitMQ wordt vaak gebruikt in microservice-architecturen om communicatie tussen verschillende microservices mogelijk te maken.
Docker en Microsoft .NET 6
Docker is een open source containerplatform dat het mogelijk maakt om applicaties te bundelen en te distribueren als containerimages. Deze containerimages kunnen vervolgens op elk systeem met Docker geïnstalleerd worden, wat ervoor zorgt dat de applicatie op elk systeem op dezelfde manier uitgevoerd kan worden. Dit zorgt ervoor dat de kwaliteit omhoog gaat. In technische termen wordt dit: “environment parity” genoemd. .NET is een softwareframework van Microsoft dat wordt gebruikt voor het ontwikkelen van Windows-applicaties. .NET kan echter ook gebruikt worden om webapplicaties te ontwikkelen en is beschikbaar voor verschillende besturingssystemen. Door het gebruik van Docker kunnen .NET-applicaties op een consistente manier worden uitgevoerd op elk systeem met Docker geïnstalleerd, wat het makkelijker maakt om deze applicaties te distribueren en te implementeren.
In wat voor case zet je SAGA bijvoorbeeld in?
Een goede case om SAGA in te zetten is een registratieproces, op basis van dit voorbeeld lig ik de case concreet toe.
Dit registratieproces begint in de microservice voor een registratie. In deze registratieservice worden niet afgemaakte registraties bijgehouden. In ons geval moet een admin gebruiker toestemming (approve) geven voor de gebruiker om in het platform te komen. Pas dan wordt er in het identity systeem een gebruiker opgevoerd en wordt er een terugkoppeling gedaan aan de registratieservice dat de registratie is afgerond.
Het begint allemaal met een klant die een registratie opvoert
In de onderstaande afbeelding is dit te zien via swagger, een front-end maakt dit natuurlijk helemaal af
Als je deze Execute dan krijg je een correlationId, dit is een waarde om de registratie aan elkaar te koppelen tussen verschillende losstaande services.
Na dat een registratie is aangemaakt heb je dezelfde CorrelationId nodig om deze openstaande registratie goed te keuren.
Vervolgens wordt er een bericht op de service bus gezet en wordt er door de Identity service een gebruiker aangemaakt. Als je dezelfde correlationId of email adres nog een keer invoert dan wordt het proces gestopt omdat deze gebruiker dan al bestaat.
Het rechterscherm met de Notifications luistert op de servicebus en geeft de registraties realtime weer.
Bij de stap “User Submit” wordt er vanuit de controller een event op de servicebus gezet. Dit doen we om alle Sagas bij elkaar te houden en in de Saga service een registratie aan te maken. In het onderstaande screen zie je de controller die een queueing service aanroept. Qua naamgeving houden we hier een command aan, dit is een intern bericht dat niet mis kan gaan. Een command blijft altijd binnen dezelfde service. Dat bekent dus dat een event met command in de naam niet gedeeld wordt tussen verschillende services. Een Event is een servicebus-bericht waar wel een mislukte variant van zou kunnen bestaan en die gedeeld kan worden tussen verschillende services.
Registration SAGA listens to RegistrationSubmittedEvent
The Registration Saga is gelinkt aan een onderliggende service, dit is gedaan in de startup door het volgende stuk code uit te voeren: services.RegisterSaga(); De Registration Service is afhankelijk van ISagaStateRepository, dit is een interface die ervoor zorgt dat de Saga service altijd op een gelijke manier een create of update kan uitvoeren.
De InstanciateAsync zorgt ervoor dat er een registratie wordt aangemaakt met de Status “Created”
Stap: Http request to /approve endpoint
Als er vanuit Swagger een POST request wordt gedaan naar het approve endpoint dan wordt er op een gelijke manier een command servicebus event uitgevoerd zodat de SAGA service deze kan oppakken.
Stap: Add RabbitMQ Event to service bus: _RegistrationApprovedEvent
In de onderstaande code wordt een registratie op approved gezet, mocht dat mislukken vanwege een Database error dan wordt er een NackException gegooid. Nack betekent Not Acknowledged. Een NackException is om RabbitMQ te laten weten dat die het opnieuw te proberen op een later moment. Als het een andere fout is dan wordt de registratie als mislukt opgegeven.
Stap: Create User
In de Identity service wordt hetzelfde patroon toegepast. De InstanciateAsync zorgt ervoor dat er een gebruiker wordt opgevoerd. In de onderliggende service UserService wordt een gebruiker aangemaakt in de database.
In de Registratie Service wordt er aan het einde de status bijgewerkt zodat er een duidelijk overzicht is van succesvolle registraties
Conclusie
Het SAGA architectuur patroon zorgt ervoor dat elk bericht minimaal één keer aankomt. Het is een complex patroon dat mogelijk relevant kan zijn binnen een complexe architectuur. Ik hoop dat ik doormiddel van deze praktische case een aantal handvaten heb gegeven.