Brakkie41 schreef op donderdag 15 november 2018 @ 10:07:
[...]
Ik krijg een beetje kriebels van dit topic. Ik heb het idee dat "monolith" en "15 jaar" per definitie wordt bestempeld als slecht. Ik heb geen inzage in de code maar dat hoeft zeker niet zo te zijn.
De monolith waar ik aan werk is 13-14 jaar oud en heeft in 2018 al 129 releases gehad. Een release bevat gemiddeld een branch of 5-10 en het gaat dan niet alleen om bugs maar ook enorme features. Er is echter de afgelopen jaren heel veel tijd gestoken in het opzetten van een stabiele pipeline voor zowel development als voor het testen van de release candidate. Combineer dat met een aandacht voor refactoren en je kan met een gerust hart refactoren zonder dat je bang hoeft te zijn dat je de boel sloopt. De code base blijft groot wat met name nadelen heeft voor het onboarden van nieuwe medewerkers maar verder is het niet anders.
Besteed aandacht aan je infrastructuur, je tests en zorg dat de boel stabiel is. Daarna kan je gaan kijken naar DDD en verantwoordelijkheden van de monolith van je afschuiven. Doe je dat niet, dan ga je op het #yolo pad en heb je kans op een grotere puinhoop dan waar je (volgens jou) nu op zit.
Het alternatief van microservices is dat als één van de grote jongens een feature wil, dat ik een PR in 7 repo's aan het uitvoeren ben in zowel NodeJS, Java en Erlang. Daar wordt je ook niet altijd even blij van
Ik denk zelfs dat je jezelf een paar keer achter de oren moet krabben voordat je ook maar aan microservices gaat beginnen. Het ontwikkelen van zo een architectuur heeft zijn eigen uitdagingen, en zolang deze niet goed worden aangepakt gaat het gegaranderd een drama worden. Hoe ga je bijvoorbeeld om met netwerk falen, het uitvallen van een instantie van een service, monitoring, logging etc etc. Zaken die in een monolith vele malen eenvoudiger zijn of zelfs niet aan de orde zijn.
Ik werk zelf ook aan een monolith, welke al een jaartje of 5 aan gesleuteld wordt, en kan alleen benadrukken dat het onderhoud aan architectuur, werkende (en nuttige) tests, stabiliteit en release automatisering vele malen belangrijker is dan de keuze van microservices vs monolith.
De infrastructuur moet uiteindelijk een middel zijn om een doel te bereiken, zoals schaarbaarheid, hoge IOPS, failure resistance en noem maar op wat voor jouw specifieke product belangrijk is. In elke organizatie zijn er unieke wensen/eisen en uitdagingen, daarom zal de aanpak ook overal anders zijn. Wat bij partij A goed werkt, kan bij party B heel anders uitpakken.
@
Furion2000Zijn er dus mensen met best practices op gebied van DDD ontwikkeling tegen een bestaande monolitische architectuur? De talloze tegenargumenten zijn wel bekend, maar de tips om te leren omgaan met DDD i.c.m. een monoliet zou op dit moment waardevol kunnen zijn.
In DDD is een fysieke scheiding van domeinen geen verplichting, een enkele applicatie opdelen in domeinen zie je dan ook regelmatig voorbijkomen. Echter is het hierbij wel oppassen dat de grenzen van je domein duidelijk blijven, bij een micro-service heb je een fysieke scheiding waardoor dit wat natuurlijker gaat.
Daarnaast zou ik beginnen met je af te vragen wat je met micro-services wilt gaan oplossen. Tegen welk probleem loop je aan met de huidige architectuur, hoe gaan micro-services dit oplossen? Vraag je altijd af waarom je zulke grote beslingen wilt gaan doen, en verwar niet het doel en het middel. Dit zie ik persoonlijk erg vaak fout gaan om mij heen.
Een heel goed voorbeeld vanuit mijn eigen ervaring;
In mijn organizatie hebben we in principe 3 monoliths draaien (1 JS frontend, 1 .NET backend en een oude MVC app), en daarnaast nog paar losse webservices. Eerst hadden we alleen de MVC app (5 jaar terug) en zijn toen vanaf scratch begonnen omdat het oude gedeelte onbeheersbaar was geworden en we niet meer konden voldoen aan de business cases met dat systeem.
Vanwege 'performance-redenen' hebben de toenmalige ontwikkelaars bedacht dat we een distributed cache nodig hadden in de backend. Dit is uiteindelijk zonder goed te redeneren waarom we het nodig hadden blindelings geimplementeerd. Uiteindelijk is het implementeren van de cache-laag een doel geworden voor vele ontwikkelaars, degene die het bedacht hadden doen het ook, dus het zal wel belangrijk zijn. Zelfs data die maar 1~2x per dag opgevraagd werd, wordt in die cache gestopt. Door de gehele applicatie zit nu die laag, en tot op de dag van vandaag heeft het ongeveer het volgende opgelevert;
-Bugs vanwege cache-invalidation issues.
-Geen merkbare performance verbetering, op sommige delen was simpelweg de sql-query nog beter qua performance.
-Ingewikkelder voor maintenance doeleinden, hoe bijvoorbeeld een handmatige data correctie doorvoeren. Dan moet ook de cache invalidate worden.
-Extra dependency naar een 3rd party component.
Ik bedoel hiermee te zeggen; laat je architectuur of een bepaalde techniek niet je doel worden. Gebruik het als een middel om de doelen te behalen die voor jouw unieke case belangrijk zijn.