Ed Vertijsment schreef op woensdag 3 juli 2024 @ 20:36:
[...]
Nu heb ik geen enkele twijfel over jouw skills om K8s in te richten

maar mijn punt was dat je dus wel die extra handjes nodig hebt voor het onderhouden van de logic (capacity planning, scaling, networking etc). Extra kosten en complexiteit dus.
Dat is natuurlijk niet allemaal nodig voor één set aan applicaties; zoals ik eerder al had genoemd raad ik bedrijven alleen aan naar k8s te gaan als je al je applicaties erheen brengt. Tot die tijd is het naar mijn mening inderdaad teveel overhead.
In mijn voorbeelden ging het om bedrijven waar ze al hun producten en webservices/sites op k8s draaiden, inclusief zaken als SSO, Kafka, elastic search etc. Dan haal je naar mijn mening ook het meest uit de flexibiliteit van het platform. En dat alles was dus goed te managen met twee Opsers.
Of je dat een moeilijk kan opdelen is nog maar de vraag, dat hangt van de applicatie af. Een punt wat ik eerder maakte is dat het veel handig is om rekening te houden met het kunnen opsplitsen in plaats van het op voorhand alles opsplitsen.
Niet elke app is Netflix (de meeste niet), en het punt dat ik maakte dat het doorgans niet een goed idee is om op voorhand altijd te beginnen met microservices omdat het geld, capaciteit en performance kost voor de meest meeste use cases, Als startup heb je vaak nog niets aan zo veel gedistribueerde logica.
Eens, maar als je al een architectuurplan hebt voor je opzet (zoals de TS) dan denk ik dat op beide manieren je iets goed neer kan zetten met toekomstvisie, en dan zou ik
persoonlijk kiezen voor microservices omdat ik merk dat die refactor anders nooit meer plaatsvindt en zaken toch wel eens willen gaan knarsen in schaalbaarheid en onderhoudbaarheid.
Ik stelde de vraag waarom een monoliet niet volstond (dat kan prima zo zijn) en waarom er microservices gebruikt moesten worden. Je gaf aan "waarom" niet en daarmee impliceer je dat dus geen noemenswaardige nadelen zijn, waar ik niet in mee ga. Hogere kosten, meer complexiteit en een grote vaag naar personeel om het te beheren lijken mij groot genoeg risico's om in ieder geval bij stil te staan. Zonder motivatie waarom microservices een goed idee zijn is het bijna altijd een slecht idee.
Mijn "waarom niet" komt dus voor uit een set aan ervaringen waar ik meer voordeel heb gezien in microservices, bij jou is dat blijkbaar andersom. Ik snap jouw gedachtengang ook maar heb het zelf altijd anders ervaren. Kosten zijn zeer goed te reduceren (zeker bij serverless, want dan kan je naar nul toe optimaliseren), complexiteit is af te vangen met platformen als Fargate of managed k8s en het beheer valt in mijn ervaring dus zeer mee.
Dat is fijn, absoluut. Alleen heb ik in de afgelopen jaren amper hardware failures of storing gezien, als er iets fout ging was het vaak software of configuratie. Het aantal outages zie ik ook hoger bij service based systemen omdat A: er meer kapot kan (onderling netwerk) en B: de complexiteit, dus foutgevoeligheid hoger is.
Dit is natuurlijk N=1 (net als mijn ervaringen, natuurlijk) maar ik zie juist bijna wekelijks issues met netwerken, regionale beschikbaarheid en hardware die er soms gewoon mee stopt. Zowel on-prem als in de cloud, alleen wordt het bij die laatste aardig weggemoffeld.
Aan de ene kant fijn, aan de andere kant vrij traag als je voor alles een netwerk call moet doen. Ook wil je nog wel eens in de problemen komen met bepaalde systemen. Voorbeeld:
- Service A houd een lijst bij
- Service A vraagt gegevens op bij service B
- Service B antwoord met een paginated set aan data
- Service A wil data van service B filteren op basis van de bijgehouden lijst
- Paginated set klopt niet meer (inconsistentie opgetreden)
Zaken die veel simpeler op te lossen zijn in een monoliet omdat we gewoon "iel vies" bij de database query/orm call kunnen en een query kunnen runnen, kun je ook een keer een fatsoenlijke index erop zetten.
Die "iel vies" is natuurlijk één van die shortcuts die genoemd werden

ik ben altijd wat allergisch voor niet weten welke delen van alle applicaties praten met iets als een DB; je kan maar moeilijk pinpointen waar welke access patterns opeens problemen opleveren. Dit los je niet zomaar op met microservices maar door de scheiding is een stuk beter te reguleren wie wat doet op welk moment omdat alle access patterns door één plek heen gaan.
Ja, je interface kan soms iets vertroebelen, maar hij zijn prima design patterns voor om dit een nette plek te geven.
Overigens is het voorbeeld hierboven los gebaseerd op een project wat WEL microservices gebruikt (en terecht) maar de zaken die jij mooi neerzet als "strakker" zijn niet per se beter. Of het beter is hangt namelijk de context af.
Zeker, en diezelfde soort design patterns heb je ongeacht infrastructurele keuzes nodig dus het één is niet beter dan het ander tot je alle "it depends" hebt doorlopen

Klinkt in theorie mooi maar als die login service omgaat gaat vervolgens elke andere service om met een gateway timeout omdat de sessie niet opgehaald kan worden. Waar die monoliet op een enkele server misschien wel genoeg headroom heeft om gewoon alle requests te beantwoorden.
Het is nu niet te zeggen of een toekomstige applicatie langer door gaat kunnen in een microservice scenario of op een enkele zware server. Punt blijft wel dat bij rust een enkele request op de zware server waarschijnlijk gewoon sneller geserveerd kan worden. De hele microservice architectuur is dat punt een premature optimization.
Niet mee eens. Als je een fatsoenlijke auth-oplossing kiest als OAuth dan kan je tokens uitleveren die niet nog eens naar de loginserver hoeven om gecheckt te worden. Daarnaast kan ik vrij oneindig de loginservice opschalen dus red ik het sowieso wel; een monoliet schaal je niet even snel even veel op tenzij je heel veel heel dure servers wil opspinnen in vergelijking met mijn relatief lichtgewicht pods.
Eerder noemde je ook dat je, je bezig met houden capacity planning, scaling, networking etc) klinkt als meer (terugkerend werk) dan die ene keer dat je een regio moet switchen. Hebben de meeste web projecten sowieso niet mee te maken. Ik haal hier verder wel uit dat je best dus nog wat tijd aan hele beheer kwijt bent. Nu is dat ook zo als je op een simpele server zet (beetje is nooit weg) maar ik kom zeker niet aan 2 personen.
Het is vooral werk dat je éénmaal doet en af en toe op terugkomt als de omgeving verder groeit. Erg weinig continu onderhoud in mijn ervaring.
Ik probeer je trouwens niet te overtuigen dat in jouw use case K8s een slechte keuze is (ik ken jouw use case niet en je klinkt wel in een situatie te zitten waarin het wellicht heel nuttig is). Mijn punt is dat het onverstandig is om altijd met microservices te start zonder gemotiveerde reden anders dan "waarom niet" en dat wel degelijk nadelen aan zitten waar wel over moet worden nagedacht.
Kom ik terug op: zonder motivatie waarom microservices een goed idee zijn is het bijna altijd een slecht idee.
En andersom probeer ik je ook niet te overtuigen van niet voor monolieten gaan, maar ik probeer vooral te laten zien dat beide kanten op voor elk voordeel een nadeel is te verzinnen en vice versa.
Woy schreef op woensdag 3 juli 2024 @ 21:05:
Sowieso is het echt niet zo dat microservices makkelijk zijn om goed op te zetten, er komt een hele legio aan andere problemen naar voren. Ik heb ook meermaals micro Services gezien die voor alles en nog wat REST calls gingen maken. Want er wordt gedaan alsof bij micro Services magisch een slimme indeling van domeinen gemaakt wordt. Ik zie vaker dat het meer een doel dan middel is.
Volgens mij heeft niemand gezegd dat het een silver bullet is, maar het is ook zeker niet moeilijk om het goed op te zetten. Veel mensen zitten echter vast in bepaalde denkwijzen en dan is omschakelen lastig - allebei de kanten op, trouwens (enigszins schuldig hier)

Als je al een goed design kunt maken, dan kan je binnen een monoliet ook gewoon een nette structuur aanhouden. En als er een hot Path is waar veel Scaling nodig is, kun je ook een micro service naast de monoliet zetten.
Eens, die gulden-middenweg heb ik ook ingezet bij klanten. Alle asynchrone processen met queues en cronjobs liepen via Lambda zodat het flink schaalbaar is maar weinig kost (en niets kost zodra er niets te doen is), terwijl de hoofdapplicatie draaide op een set EC2s voor de brute kracht die ze nodig hadden voor hun data analytics.