[HN Gopher] Why our team cancelled our move to microservices
       ___________________________________________________________________
        
       Why our team cancelled our move to microservices
        
       Author : start123
       Score  : 93 points
       Date   : 2022-01-25 21:01 UTC (1 hours ago)
        
 (HTM) web link (steven-lemon182.medium.com)
 (TXT) w3m dump (steven-lemon182.medium.com)
        
       | andrewstuart wrote:
       | Microservices shift complexity from code to operations -
       | microservices don't remove complexity - they spread it wider,
       | making the whole more complex.
        
         | Kalium wrote:
         | I agree that microservices shift complexity, but I'm not sure
         | that this inherently results in an overall increase in
         | complexity. For example, using highly automated ops tools like
         | autoscaling and load balancing can enable smooth handling of
         | problems that can be challenging to handle in code.
        
         | FridgeSeal wrote:
         | It's about trade offs I think.
         | 
         | Monolith can Microservices are so often presented as "x is
         | better than y", but it should be "which is more applicable for
         | the team size, product and operational concerns".
         | 
         | Monoliths are a great choice for certain team sizes and
         | applications, want stricter isolation and blast-radius between
         | different teams and products and need to scale different things
         | differently? Micro services are probably a better choice.
        
         | ironmagma wrote:
         | Examining behavior in the limit (a la physics) is interesting.
         | Imagine a system where every function call goes out to a
         | separate process. Suddenly you have a lot of processes waiting
         | around to be called. Debugging requires special tools.
         | Profiling becomes a nightmare. Even determining if the system
         | is fully running becomes difficult. What have you gained?
        
           | edude03 wrote:
           | Minor nit: functions as a service are almost exactly this -
           | and they (from a technical perspective) don't wait to be
           | called, they pop into existence just in time.
           | 
           | Arguably though it's not special tools is just different
           | tools. You usually can't run a debugger live in production
           | but with tools like distributed tracing and service meshes
           | you get really close
        
           | whimsicalism wrote:
           | > What have you gained?
           | 
           | Separation of responsibilities? Easier to analyze because you
           | only have so many inputs and outputs to a simpler system?
           | 
           | Debugging something that touches a lot of paths in a monolith
           | can be quite nightmarish as well.
        
             | bcrosby95 wrote:
             | Most comments about this assumes a poorly designed monolith
             | and a well designed set of microservices. A microservices
             | architecture can be a rats nest too.
             | 
             | I guess what it means is that even if you can build a well
             | modularized system, it will only stay well modularized if
             | you use a network call to enforce it. Well, at least for
             | most companies.
             | 
             | Conceptually, there's nothing keeping you from designing
             | your codebase to work as both microservices or direct
             | calls. I've certainly done it before - each service defined
             | a Java interface, and codegen could hook that up as either
             | a direct call or to route over some kind of layer.
        
               | whimsicalism wrote:
               | Or something that can be spun up as a service or imported
               | as a library
        
             | ironmagma wrote:
             | > you only have so many inputs and outputs to a simpler
             | system?
             | 
             | Doesn't a function only have so many inputs and outputs
             | too? Scope capturing/global variables aside.
        
               | whimsicalism wrote:
               | > Doesn't a function only have so many inputs and outputs
               | too? Scope capturing/global variables aside.
               | 
               | Sure, and a microservices architecture to me implies a
               | larger movement towards function-esque, idemopotency,
               | analyzability and away from global state.
               | 
               | To me, monolithic architecture implies global shared
               | state that is difficult to reason about.
        
         | [deleted]
        
       | rydgel wrote:
       | Why would you consider microservices if you are only 12
       | developers?
        
         | tored wrote:
         | It can sometimes make sense even that small, like if team has
         | different geographical locations and/or time zones.
         | 
         | And that I think how you should approach micro services, to
         | solve an organizational problem, not use it for solving a
         | technical problem.
        
         | bhuber wrote:
         | Most of the conversation so far has focused on the development
         | benefits of microservices (decoupling deployments, less
         | coordination between teams, etc). Small teams don't really have
         | this problem, but there are other benefits to microservices.
         | One of the biggest is scaling heterogeneous compute resources.
         | 
         | Suppose, for example, your webapp backend has to do some very
         | expensive ML GPU processing for 1% of your incoming traffic. If
         | you deploy your backend as a monolith, every single one of your
         | backend nodes has to be an expensive GPU node, and as your
         | normal traffic increases, you have to scale using GPU nodes
         | regardless of whether you actually need more GPU compute power
         | for your ML traffic.
         | 
         | If you instead deploy the ML logic as a separate service, it
         | can be hosted on GPU nodes, while the rest of your logic is
         | hosted on much cheaper regular compute nodes, and both can be
         | scaled separately.
         | 
         | Availability is another good example. Suppose you have some API
         | endpoints that are both far more compute intensive than the
         | rest of your app, but also less essential. If you deploy these
         | as a separate service, a traffic surge to the expensive
         | endpoints will slow them down due to resource starvation (at
         | least until autoscaling catches up), but the rest of your app
         | will be unaffected.
        
           | jeremyjh wrote:
           | So sure, maybe make the ML model a separate service, but you
           | don't really have the same driver for other services; state-
           | less server processes tend to need the same type of resources
           | only in different amounts, and you don't really gain anything
           | by splitting your work load based on the words used in your
           | domain description.
           | 
           | Real-world monoliths often do have some supporting services
           | or partner services that they interact with. That doesn't
           | mean you need a "micro-service architecture" in order to
           | scale your workload.
        
         | FridgeSeal wrote:
         | Because the team might already be comfortable working in that
         | way? Because certain parts of the application might require
         | specialised implementations and very natural lines of
         | separation fall out?
         | 
         | I'm in a team of 4 and the few API's we expose would be
         | considered microservices. We did that because it was easiest
         | and fastest for us to build and maintain and the features we
         | provide were all quite distinct.
        
       | kgeist wrote:
       | Just last week I found an interesting and unexpected (for me)
       | advantage of microservices. We have two monoliths written in
       | different stacks/frameworks, and developed by different
       | departments. Monolith #1 is being split into microservices, we
       | already have around 20 microservices. Monolith #2 kind of lags
       | behind, and there are certain problems that they encountered,
       | which are already solved in one of the microservices split from
       | monolith #1. The solution I came up with is to simply reuse the
       | microservice from monolith #1 in monolith #2 (the service is
       | isolated and self-contained so it doesn't care who uses it). I
       | found it to be a rather elegant and simple solution for cases
       | when you want to reuse an implementation but can't package it
       | into a library because clients have different stacks.
        
       | Ostrogodsky wrote:
       | Medium? Nah
        
       | fdgsdfogijq wrote:
       | It took me a while to accept that microservices are better. Not
       | in every case, but in a surprising number of cases. They really
       | shine when combined with serverless computing. Clear seperation
       | of code by a networking call is the next logical step in the
       | encapsulation principle of object oriented programming. We hide
       | the implementation details and only expose an interface, which
       | creates seperation and forces us to stop sphagetti logic.
       | Microservices are the enxt step in that design pattern, and only
       | with the improvement in container technology and cloud computing
       | has this become achievable (in the sense of there not being so
       | much operations and complexity overhead).
        
         | winternett wrote:
         | A size 20 shoe is better for a large foot... But not better for
         | a size 15 or size 10 foot.
         | 
         | Saying Microservices are better is the same as me saying "a
         | size 20 shoe is better than any other shoe"... for everyone.
         | 
         | It's not a viable statement in any use case, except for people
         | with size 20 feet.
         | 
         | The business need is what determines the solution necessary.
        
           | fdgsdfogijq wrote:
           | I know its not a catch all. But more often than I would like
           | to admit they bring simplicity and reduce complexity. The
           | more I develop software, the less I can stomach monoliths
           | running on some big server. The other day I was considering
           | deploying an MVP I have written on Django, and instead just
           | ripped it apart and pushed the pieces into their own seperate
           | lambdas. Deploying some monolith API like that was nerve
           | wrecking, updates are, the blast radius is higher, and the
           | composability of components is easier with smaller
           | microservices.
        
         | shuntress wrote:
         | I think the catch is that "Services" are typically the scope at
         | which encapsulation should stop.
         | 
         | They don't need to be "Micro".
        
           | pc86 wrote:
           | This is just arguing over the service boundary definition and
           | not the architecture. There are multiple comments here trying
           | to differentiate between a "service" and a "microservice"
           | which seems like a fools errand to me.
        
         | jokethrowaway wrote:
         | I hope you're trolling.
         | 
         | If not, enjoy implementing joins across services.
        
           | pc86 wrote:
           | Doesn't this just mean you picked a bad service boundary? You
           | shouldn't have to join across services, ever.
           | 
           | Seems like a straw man.
        
             | dagss wrote:
             | "just picked a bad service boundary" -- well that's the
             | thing isn't it. If you always pick the right boundary up
             | front, something that is perfect both now and also
             | anticipates any kind of future crazy feature request -- if
             | you can pull that off I'd say _any_ architecture will work
             | well.
             | 
             | But most people get boundaries wrong some times. Sometimes
             | very badly wrong. Sometimes the boundaries are historical,
             | set by product owners without technical input, set by
             | junior developer, set by superficial attributes, and
             | sometimes even the most experienced developer-architect
             | just does a mistake.
             | 
             | And the whole point of not doing microservices is you don't
             | have a huge investment in your boundaries, it's more
             | feasible to change them once you inevitably now and then
             | realize you got them wrong.
        
             | tored wrote:
             | It will eventually happen even if you manage to create the
             | perfect boundaries, e.g for report & statistics.
        
               | rodorgas wrote:
               | You shouldn't be doing report and statistics on live
               | data, but in a data warehouse.
        
               | dragonwriter wrote:
               | Reports and statistics, especially on material that
               | crosses service boundaries (but even on single-service
               | information, to keep services single-responsibility) are
               | their own logical services, which operate on copies of
               | data received from (often multiple) upstream services.
               | (In many real world cases, you'll want this functionality
               | in a data warehouse, but there are some cases where some
               | of it may be in something that looks like normal
               | services, whose data that can change other than by push
               | from other services deals with reporting and report-
               | delivery configuration, not the business data on which
               | reporting is done.)
        
         | quickthrower2 wrote:
         | > Clear seperation of code by a networking call is the next
         | logical step in the encapsulation principle of object oriented
         | programming.
         | 
         | You can have clear separation at the import/library level
         | though. No need to add that extra latency to every call.
        
       | winternett wrote:
       | The term "Monolith" was devised by people who wanted to brand
       | microservices as newer and superior.
       | 
       | It's almost as if in order to succeed these days you need to
       | discredit and disparage your competition rather than simply
       | having a better product, and that's why I don't buy into buzz
       | words at all.
       | 
       | If it's not broken, don't fix it... Microservices are relatively
       | new and unproven. The way the world has rushed to dive into
       | microservice infrastructure only highlights reckless spending and
       | waste that is characteristic of overpriced goods and high taxes
       | that are constantly in turn thrust upon us, as consumers.
       | 
       | Microservice architecture is also inherently designed to lock a
       | customer into very specific tools that make future migration to
       | any other platform a very costly decision in most cases...
       | Thereby locking a customer into platform-specific dependency.
       | Microservices architecture also introduces the ability for
       | providers to charge for each specific service as a utility...
       | Instead of being charged for one single server annually, on
       | microservices you can be charged for many individual components
       | that run your app independently, and when usage skyrockets, it's
       | a sticker shock that you can only stop by going offline.
       | 
       | We have also seen enough failures and pain points within
       | microservice and even cloud architectures over the past two years
       | alone to raise questions about whether or not it it indeed a
       | better solution.
       | 
       | We need to stop disparaging traditional (non-cloud) hosting and
       | solutions that aren't obsolete at all in this manner, and focus
       | on what works, what is secure, and what is cost effective in
       | order to stay sustainable into the future.
       | 
       | The more we allow marketing minds to take control of our IT
       | decisions over reasonable technical minds, the more costly it
       | will be to us all over time, no matter what salary we make. Bog
       | tech firms will hate me for saying this, but any human in the
       | chain can tell that reckless drive for weak/vulnerable/costly/and
       | over-complex IT solutions cannot be sustained as a viable long-
       | term business sales strategy anyway.
        
         | duxup wrote:
         | I don't even know what anyone means by monolith or micro
         | services.
         | 
         | I'm somewhat sure everyone is somewhere in between depending on
         | who you ask.
        
           | staticassertion wrote:
           | ISBN-13: 978-1491950357 ISBN-10: 1491950358
           | 
           | Here you go, you can read this book and it explains.
        
             | duxup wrote:
             | I know what the terms means, but I think in common language
             | people mean different things when you find out what they
             | are doing.
        
               | staticassertion wrote:
               | Oh, sure. People are wrong a lot.
        
         | ryan_j_naughton wrote:
         | > Microservice architecture is also inherently designed to lock
         | a customer into very specific tools that make future migration
         | to any other platform a very costly decision in most cases...
         | Thereby locking a customer into platform-specific dependency
         | 
         | Can you elaborate on this? Examples? Thanks!!
        
         | glintik wrote:
         | > Microservices are relatively new and unproven.
         | 
         | They are so old, buddy, actually. Splitting monolith into
         | services(not always been micro) is a natural evolution for any
         | software.
        
           | winternett wrote:
           | Agreed in essence... The ideology is indeed old, but the
           | practice of putting flashy wrappers and catchy names around
           | the services are new.. Like "Dynamo DB" and "Route 53". Those
           | names appeal to non technical product owners that then force
           | adoption onto development teams... Pure fluff at it's best.
           | 
           | That's the think about the marketing first model we're
           | dealing with now... No real innovation, just branding/name
           | changes and highly tailored customization to lock a customer
           | into a specific platform.
        
           | Clubber wrote:
           | It was SOA (Service Oriented Architecture) where you would
           | split them up, that predates Microservices by quite a bit. I
           | remember doing that in the early 2000s.
           | 
           | What I think he is saying is that Microservices people pitch
           | their service against monolith as better, but monolith hasn't
           | been in vogue for 20 years. I saw the same tactic with scrum
           | people pitching against waterfall which hadn't been in vogue
           | for quite a while either.
        
             | hdjjhhvvhga wrote:
             | Well, SOA is such a broad term. If you include CORBA, you
             | could say it's terrible. On the other hand, gRPC is a
             | pleasure to work with if you need to deal with different
             | environments.
        
             | jbverschoor wrote:
             | Although clunky to implement, EJB had really well thought
             | out concepts, architecture and roles
        
             | [deleted]
        
             | [deleted]
        
           | ozim wrote:
           | I don't think it was "splitting monolith" it was more like
           | connecting separate applications.
           | 
           | Like you had a payroll in your enterprise of 1000 employees
           | and you needed that same data in 5 applications in 3
           | different departments. So you would wrap payroll into a
           | service and have that data accessible in multiple places.
           | 
           | I think that is still a valid approach to build monolith app
           | and use multiple services if they are internal apps.
           | 
           | For customer facing and quickly changing stuff you might want
           | to add microservices to be able to build new features quickly
           | when ideally microservice should have its own database with
           | what it needs to operate.
        
           | da_chicken wrote:
           | > Splitting monolith into services(not always been micro) is
           | a natural evolution for any software.
           | 
           | No less natural than "joining the innumerable incompatible
           | and bug-ridden fragments into a single unified solution."
           | 
           | Linux is a bazar. Except distros and package repositories are
           | cathedrals.
           | 
           | Windows is a cathedral. Except software distribution is a
           | bazar.
        
           | rzz3 wrote:
           | Yeah, it used to be called "Service Oriented Architecture",
           | and is nothing new.
        
         | Graffur wrote:
         | > The term "Monolith" was devised by people who wanted to brand
         | microservices as newer and superior.
         | 
         | I am interested in hearing more history on this
        
         | [deleted]
        
         | staticassertion wrote:
         | > It's almost as if in order to succeed these days you need to
         | discredit and disparage your competition rather than simply
         | having a better product, and that's why I don't buy into buzz
         | words at all.
         | 
         | Meh. In order to sound smart on HN it's easiest to point at
         | something and call it "hype".
         | 
         | > Microservices are relatively new and unproven
         | 
         | SOA is old as fuck. Microservices are also fairly old, but
         | especially when you consider they're really just SOA + dogma.
         | 
         | > Microservice architecture is also inherently designed to lock
         | a customer into very specific tools that make future migration
         | to any other platform a very costly decision in most cases...
         | 
         | No? Not at all.
         | 
         | > Instead of being charged for one single server annually, on
         | microservices you can be charged for many individual components
         | that run your app independently, and when usage skyrockets,
         | it's a sticker shock that you can only stop by going offline.
         | 
         | Alternatively phrased: If you only use one service you only pay
         | for it, not for the whole suite of features you don't need or
         | want.
         | 
         | > We have also seen enough failures and pain points within
         | microservice and even cloud architectures over the past two
         | years alone to raise questions about whether or not it it
         | indeed a better solution.
         | 
         | And plenty of success stories.
         | 
         | > We need to stop disparaging traditional (non-cloud) hosting
         | and solutions that aren't obsolete at all in this manner, and
         | focus on what works, what is secure, and what is cost effective
         | in order to stay sustainable into the future.
         | 
         | Microservices work, are secure, and are cost effective.
         | 
         | Honestly your post contains no useful information and is
         | satirically close to a "return to traditional family values!"
         | speech.
        
         | ozim wrote:
         | That is how you get to it.
         | 
         | If you are noname rapper you start dissing bigger guys so they
         | diss you back and you get notoriety because someone noticed
         | you.
         | 
         | As a politician you have to say others are the worst and broke
         | everything but you have plan to fix everything that is broken
         | now.
         | 
         | In the end all the swearing is posturing and all "great plans"
         | turn out not possible in reality.
         | 
         | While yes you can do nice stuff with microservices, it is not a
         | silver bullet.
        
         | serial_dev wrote:
         | Microservices make sense in some scenarios.
         | 
         | I work at a large retail company with who knows how many
         | developers. We have different teams for payment, promotions,
         | product search, account, shipping and more. All of them working
         | on a single codebase with coordinated deployments would be a
         | nightmare.
         | 
         | Previously, I joined a startup (previous coworkers of mine), a
         | developer and a business guy. The developer "drank the
         | microservices kool-aid", and came up with (in theory) super
         | scalable solutions and like a dozen of microservices. It was
         | difficult to keep things in mind, the tech stack was way too
         | complicated for two developers. It was also less performant and
         | more costly. The added complexity was totally unnecessary,
         | especially because we never got neither tons of users, nor more
         | developers. The business guy trusted the developer, so the
         | company never worked enough on their product and USP. I guess
         | the developer just didn't want to accept that the fancy tech
         | solutions won't bring success.
         | 
         | Yet another time, we were a small team (5-ish devs, product
         | owner, and a designer). We started with a monolith and we paid
         | attention to software design and moved quickly.
         | 
         | Also, for some reason it's often overlooked, that you can make
         | your monolith modular and design it so that when the day comes,
         | you can split it up into smaller services. You don't need to
         | start with microservices, you can start with a monolith and
         | figure out later how to split it up (if necessary).
         | 
         | Microservices and "monoliths" have their place, you just need
         | to know when to use which.
        
       | rodorgas wrote:
       | Is there any way to read without login?
        
         | f0xtrot wrote:
         | edit: nvm; its not the full article.
         | 
         | Found it on outline[.]com
         | 
         | https://outline.com/Leznmz
        
           | rodorgas wrote:
           | Isn't it cropped on the first paragraph for you?
        
         | quickthrower2 wrote:
         | https://pastebin.com/BcA7r18x
        
       | jpalomaki wrote:
       | Some perspective from Netflix. Around 10k employees [1] (could
       | not find how many are working with software), more that 1000
       | microservices [2].
       | 
       | The second article also provides some insight to the services.
       | Those make sense for me - they truly sound like independent,
       | relatively large pieces of software. Not like "LoginService" type
       | of things you sometimes see.
       | 
       | Few examples: 1)Create a main menu list of movies 2)Determine
       | your subscription status to provide content relevant to that
       | subscription tier 3)Use your watch history to recommend videos
       | you may like
       | 
       | [1]
       | https://www.macrotrends.net/stocks/charts/NFLX/netflix/numbe...
       | [2] https://www.cloudzero.com/blog/netflix-aws?hs_amp=true
        
       | glintik wrote:
       | "Microservices had been sold to us as the ideal architectural for
       | perhaps a year now." When he learn that there is no ideal
       | architectural in software? )
        
       | luhego wrote:
       | I think that moving a monolith to a microservices architecture is
       | only justified if the organization size is large enough, so there
       | are different business teams/departments. In that scenario, each
       | team/department will own a microservice and this will speed up
       | the development on each team. Still, every time there is a change
       | in any microservice API, that will require coordination. For a
       | small company(12 developers), I can't see the benefit.
        
       | tored wrote:
       | I wish more languages had an abstraction layer above namespaces,
       | classes & interfaces, something like Java modules, to help
       | organize a large monolith.
       | 
       | Instead of creating isolation over an network interface we add an
       | abstraction to achieve it.
        
       | kirse wrote:
       | I always start with a monolith while keeping microservices in
       | mind. Have clear communication boundaries, avoid shared state as
       | much as possible, consider asynchronous and parallel processing
       | needs, etc.
       | 
       | Actor systems are a natural fit for this eventual de-coupling.
       | What starts as a simple actor w/ a mailbox can eventually grow to
       | a standalone REST service with minimal headache in architectural
       | refactoring.
        
       | f0xtrot wrote:
       | Article is from 2019.
        
       | contextfree wrote:
       | I'm not speaking from experience here, but it seems like rather
       | than "moving to a microservices architecture" it would perhaps be
       | better to think more in terms of "splitting out specific
       | functionality X into an independently deployable and hostable
       | service, which should alleviate the specific problem Y that we've
       | been experiencing due to their being too closely coupled" and if
       | there are no obvious X and Y then maybe the "monolith" is fine?
        
         | wpietri wrote:
         | For sure. Find a problem first, then look at solutions. Try one
         | out, see if it helps. If not, try a different solution.
         | 
         | Man-with-a-hammer syndrome is dangerous.
        
       | shroompasta wrote:
       | Their architecture didn't provide any clear boundaries to be
       | sufficient for microservices, however that isn't the case for
       | many medium to larger sized projects.
       | 
       | (By the way, just because there's still quite a bit of coupling
       | between services, doesn't mean there aren't clear boundaries -
       | Microservices can communicate with one another all the time and
       | still be justified in being decoupled)
       | 
       | There isn't an absolute answer to monolith vs microservices - It
       | depends case by case.
       | 
       | Instagram was built using Django and I'm unsure of ig's
       | architecture today, but it remained monolithic for a very long
       | time (at least till late 2019), and if that architecture sufficed
       | for Instagram, I'm sure it would suffice for many other projects.
       | 
       | However, still, it's not a this or that as many of the comments
       | here would seemingly imply - Again, it's HEAVILY dependent on the
       | case.
        
       | GrumpyNl wrote:
       | There is a big misconception that a monolith has to be fully
       | deployed every time. A well designed monolith can be partially
       | deployed.
        
         | Softcadbury wrote:
         | Can you say more about that ? I'm a DotNet developer and I
         | don't see how this could be possible without having several
         | applications
        
           | henryfjordan wrote:
           | If a monolith has routes /a and /b, you can deploy the whole
           | service to 2 servers with a proxy where all of the requests
           | for /a goes to server 1 and all the requests for /b go to
           | server 2. Server 1 has all the code to respond to /b but will
           | never see that request.
        
           | atwebb wrote:
           | Feature flagging comes to mind, just don't expose the pieces
           | that don't work or are in-progress? or .exclude or something.
        
         | pc86 wrote:
         | How?
        
           | lemmsjid wrote:
           | The 'monolith' (which I find a silly term but I'll use it
           | here) can expose different parts of itself as services. As
           | long as those services can be versioned and are backwards
           | compatible, you can deploy the monolith using any schedule or
           | notification mechanism you like.
           | 
           | If the monolith is composed of modules with a DAG-like
           | dependency structure (e.g. maven projects), then pieces of
           | the monolith can be deployed alongside the dependencies they
           | need.
        
             | Graffur wrote:
             | I think the problem is there's no popular framework that
             | makes this easy (or is there?)
        
       | pythux wrote:
       | > Recently our development team had a small break in our feature
       | delivery schedule. Technical leadership decided that this time
       | would be best spent splitting our monolithic architecture into
       | microservices.
       | 
       | Maybe redesigning the architecture of the product just because
       | there is time vs. there have a pain point/problem that needs
       | solving is already a red flag. In this context it feels like
       | "micro services" was a hammer looking for a nail, and they had no
       | such nail.
        
         | LASR wrote:
         | Exactly.
         | 
         | Microservices can solve for some problems, eg: scaling
         | infrastructure in a non-uniform manner or scaling development
         | velocity non-uniformly across many teams.
         | 
         | But there are also tons of other ways to solve these problems.
         | The mistake is in assuming that you need microservices to do x,
         | without really critically thinking about what is actually
         | stoping you from having x right now.
         | 
         | The move to microservices (or any similar kind of rewrite
         | efforts) should be undertaken only when it's painfully obvious
         | that it's needed.
        
       | vmception wrote:
       | I think many microservice implementations are more complex than
       | necessary but I also am extremely skeptical of someone's
       | competence if the database is on the same compute instance as
       | everything else
        
         | cyberge99 wrote:
         | I'm skeptical because they're on IIS in 2022.
        
         | feoren wrote:
         | Rephrasing: "this person, who is probably solving a very
         | different problem with different design constraints than me, is
         | doing things differently than the handful of ways I have ever
         | seen in my limited career, and is therefore stupid."
        
       | foxyv wrote:
       | Going from a monolith to a micro-service setup is essentially my
       | idea of a Christian hell. Swirling depths of pain and uncertainty
       | interspersed with screaming and urgency. There is no rest. No one
       | knows when it will end.
       | 
       | I think this is because our monoliths are so complicated they
       | hide away our technical debt like monstrous Jack-In-The-Boxes.
       | When you start breaking it into chunks all of these issues come
       | exploding out of them. Suddenly huge bugs that no one noticed or
       | cared about are showing up in testing. Old libraries that sat
       | dormant wake from their crypts to harass and torture junior
       | developers. Forgotten binaries whose source code was lost with
       | the changeover from ancient source control software to GIT starts
       | showing up security issues in VeraCode.
       | 
       | Really, a well coded monolith is just a bunch of micro-services
       | on the same server communicating through memory. In reality it's
       | more of a Lich who's eyes shine with the light of the tortured
       | souls of fallen QA testers and developers.
        
         | dasil003 wrote:
         | Agreed, however I've experienced something worse: trying to
         | refactor domain models across an SOA that was poorly factored
         | to begin with, and then layered 10k eng-years of incremental
         | feature development driven by a fractured product team with
         | short average tenures.
        
       | misterbwong wrote:
       | The real problem in monolithic codebases isn't that it's large
       | and needs to be separated- it's that the pieces are logically
       | coupled. Microservices force you into separation but do not force
       | decoupling.
        
       | mykowebhn wrote:
       | > It is useful to bear Conway's law in mind when considering the
       | shape of your architecture. It states that your software's
       | architecture grows in a way that mimics how your organization and
       | teams are structured.
       | 
       | I had always assumed that it was the other way around. Good to be
       | made aware of the alternative.
        
       | nurettin wrote:
       | > A benefit of microservices is that each team can be responsible
       | for releasing their services independently and without
       | coordination with other teams.
       | 
       | Sounds almost sarcastic. How do you deliver API changes without
       | alerting other teams?
        
         | willcipriano wrote:
         | I'd guess that 90-95% of tickets do not alter a existing API in
         | a non-backwards compatible way
        
         | linuxdude314 wrote:
         | Do you not version APIs you design?
         | 
         | When engineering an API meant for consumption by disparate
         | services it's imperative to provide back words compatibility.
         | 
         | This is pretty basic stuff anyone designing a serious API
         | should be taking into account.
        
           | dzhiurgis wrote:
           | Sure we do, it's been /v1.0/ for the last 2 years!
        
         | tombert wrote:
         | Generally speaking if you're adding another field to a JSON or
         | something, that doesn't really break the parser [1] or affect
         | downstream. While you should still probably let the downstream
         | teams know, it's not necessarily going to break anyone's code.
         | 
         | [1] I'm aware that that's not always true (e.g. adding a field
         | that's ridiculously large choking up the parser).
        
           | darrylb42 wrote:
           | or you have a customer that has strict validation on and
           | adding a field breaks their ability to deserialize.
        
         | wging wrote:
         | Not all changes result in a change to the way your service is
         | called, and even those changes can (with some effort and care)
         | be made backwards-compatible. Performance-level changes are one
         | obvious one - for example, I wouldn't expect to have to keep my
         | caller in the loop if I decrease my API's latency by 50ms, even
         | though it might be a good idea.
         | 
         | But other behavior changes are also not necessarily something
         | that _requires_ a team to be alerted. A good design provides an
         | abstraction where the caller shouldn 't have to care about the
         | underlying implementation or details of how a request is
         | fulfilled.
        
         | bilalq wrote:
         | This is how things were done at Amazon quite successfully. The
         | golden rule is to never break API backwards compatibility. If
         | you must, create a new version of the API and leave the old
         | version functional. If you need to shut down old functionality,
         | it becomes a campaign you have to drive to move your dependents
         | off of it. One little thing that people often overlooked but
         | was very important was to have API operations for describing
         | your enums rather than just putting them in the docs. This
         | allowed for easier adoption of them by API consumers and forced
         | them to consider what to do in the case of an unrecognized
         | value being encountered.
        
           | kgeist wrote:
           | >The golden rule is to never break API backwards
           | compatibility. If you must, create a new version of the API
           | and leave the old version functional
           | 
           | It also helps with zero-downtime deployments:
           | 
           | 1) spawn a new instance of the service with the new API, side
           | by side with the old one
           | 
           | 2) now incoming traffic (which still expects the old API) is
           | routed to the new instance with the new API, and it's OK,
           | because it's backward-compatible
           | 
           | 3) shut down the old instance
           | 
           | 4) eventually some time later all clients are switched to the
           | new API, we can delete the old code
        
             | noogle wrote:
             | How can accumulation of versions be prevented? Now the same
             | team has to maintain two products, and the underlying
             | mechanism is still limited by the older version.
             | 
             | Anecdotally, a robust backward-compatibility has been seen
             | as a hinderance to e.g. Java's progress (so much that a
             | newer language, Kotlin, was created to break free from that
             | burden).
        
               | trinovantes wrote:
               | One way is to rewrite version N endpoints to use version
               | N+1 endpoints. You just need to ensure clients can handle
               | null/empty data so that when some requested data is
               | depreciated, you don't break old apps. The increased
               | latency from N conversion calls also encourage the oldest
               | clients to migrate without breaking backwards
               | comparability.
        
               | ARandumGuy wrote:
               | There isn't really a solution to version bloat aside from
               | good processes and general diligence. There's no easy way
               | to handle that sort of thing, unfortunately.
               | 
               | However, I do think it can be easier to deal with for
               | internal services then for something like Java. When the
               | number of users is in the dozens rather then the
               | millions, it's a lot easier to make sure everyone gets
               | moved over to the new version.
        
               | kgeist wrote:
               | Well we usually coordinate between the teams. I.e. we
               | don't force other teams to make changes as soon as
               | possible (they have their own plans) but we agree to add
               | relevant changes to their backlog, so that it was fixable
               | in a 1-2 month window.
        
           | zoover2020 wrote:
           | And still done! Fully agree.
        
         | jeffbee wrote:
         | Don't ever change APIs. It's pretty simple. I don't know why
         | the monolith people believe this is such a gotcha.
         | 
         | If you really need to change the API, give the new API another
         | name. You may choose to think of this as "versioned APIs", if
         | you want, but "versioned" and "renamed" are the same thing.
        
         | shuntress wrote:
         | > Sounds almost sarcastic. How do you deliver API changes
         | without alerting other teams?
         | 
         | Sounds almost sarcastic. To deliver API changes without
         | alerting other teams you, of course, simply deploy the changes
         | without sending a message to the other teams.
         | 
         | The non-sarcastic answer is that sometimes you want to make
         | changes that will not affect an APIs users in any significant
         | way. Of course you would still document these changes in a
         | change log that the consumers of the API may or may not check.
         | Or you may want to hype/market these changes for clout reasons.
         | 
         | Maybe it's an API that services multiple sets of users with
         | different partially-overlapping requirements and they don't all
         | need to know about the new change.
         | 
         | Maybe it's a soft launch for a surprise feature that's going to
         | be announced later.
         | 
         | Maybe the other team is on vacation and you just want to get
         | changes out the door before some holiday.
        
         | jacobsenscott wrote:
         | Also, this (independent deployability) is simply not a feature
         | of microservices. It is a feature of any _well architected_
         | code base.
         | 
         | I've always worked on monoliths, and I've almost never needed
         | to coordinate a release with anyone. I just merge my branch and
         | deploy. Github and shopify talk about merging and deploying
         | monoliths hundreds of times per day without coordination.
         | 
         | The case where you would need to coordinate a release in a
         | monolith is exactly the same case where you would need to
         | coordinate a release in microservice app. That's the case where
         | your change depends on someone else releasing their change
         | first. It doesn't matter if their change is in a different
         | service, or just in a different module or set of modules in the
         | same application.
         | 
         | Now, most application are _not_ well architected -
         | micorservices or monoliths. In the case of a poorly architected
         | app deploying a monolith is much easier anyway. Just merge all
         | that spaghetti and push one button, vs trying to coordinate the
         | releases of 15 tangled microservices in the proper order.
        
         | root_axis wrote:
         | Never break the API. If you need a new API contract use API
         | versioning so that consumers can upgrade when it's convenient.
         | Additionally, use contract testing.
        
         | jokethrowaway wrote:
         | That's why finding the right boundaries between services (yes,
         | services, microservices is a harmful buzzword) is important, so
         | that you minimise having to communicate and coordinate with
         | other teams.
        
           | volkk wrote:
           | 100%. Boundaries are extremely important, and if you're a
           | service onto which 7 other teams rely on, there's an issue
           | with your teams and the way you've setup your services.
           | Bounded contexts!
        
         | no_wizard wrote:
         | Proper deprecation procedures. you can document how you
         | uniformly deprecate and remove APIs. This is a strength of
         | using something like OpenAPI for documentation, or GraphQL, for
         | instance. It is then the responsibility of a consumer to deal
         | with these deprecation(s). On the most basic level you could
         | also do versioning, though its not _my_ recommendation
         | 
         | Document and set expectations accordingly. I've done this move
         | before breaking apart a monolith into separate micro services
         | and this is key. Spending more time on good documentation is
         | generally a good idea regardless.
         | 
         | I'm assuming we're not talking about public facing APIs. That's
         | a situation where versioning might make a lot more sense.
        
         | FpUser wrote:
         | Something like Microsoft does with the their interfaces
         | 
         | They have multiple versions of calls. The older one function as
         | before and never change. Want different behavior - here is
         | your_interface_v1(), your_interface_v2(), etc.
         | 
         | You still alert team about new functionality but they're free
         | to consume it at their own pace. This of course involves a
         | boatload of design and planning.
         | 
         | I am in general against microservices and consider those as the
         | last resort when nothing else works. To me a microservice is
         | mostly my monolith interacting with another monolith.
         | 
         | When monolith becomes big enough that it needs 2 teams I
         | usually handle it by each team releasing their part as a
         | library that still gets linked into the same monolith. That is
         | my version of "microservice" when the only reason for it to
         | exist is to have two or more "independent" teams.
        
       | giaour wrote:
       | > Microservices allow your team to have control over the full
       | stack they require to deliver a feature.
       | 
       | This is honestly pretty rare, at least in my experience. What I
       | have seen is that organizations will buy in to the microservices
       | hype, then dictate to their teams what stacks, deployment
       | paradigms, etc. (sometimes even down to the sprint cadence) are
       | acceptable.
        
         | beebmam wrote:
         | My experience is the opposite of yours. Teams I've worked with
         | get massive freedom to implement their services with any
         | (reasonable) language + framework: Rust, Python, Java, Go, C++,
         | C#, and so on.
         | 
         | Seems like an organizational decision
        
       | jedberg wrote:
       | > We have approximately 12 developers spread across 2 feature
       | teams and a support team.
       | 
       | If I were consulting for this company, I would have told them to
       | stop right there, microservices are probably not for them. Unless
       | you build from the start for microservices on something like AWS
       | lambda, doing with such a small team would be really hard.
       | 
       | And as they eventually discovered, a lot of unnecessary overhead
       | for such a small team.
        
         | wpietri wrote:
         | One of the questions I like asking developer pals is what ratio
         | their company has between engineers and services/deployable
         | units. Anybody reading this care to share?
         | 
         | For me, that number says a lot more about the day-to-day life
         | of devs than the microservices vs monolith label does.
        
           | jedberg wrote:
           | I don't remember the hard numbers, but on average each
           | service was maintained by about 4 people but there were
           | outliers in both directions. Sometimes there were four or
           | five services maintained by one person, and sometimes there
           | was one service backed by a team of 25+.
           | 
           | The other important number was that about 25% of engineering
           | was dedicated to building the tools to manage the
           | microservices. We didn't work on customer facing software --
           | the other engineers were our customers. And I found that
           | number to be pretty consistent amongst any company that was
           | fully invested into microservices.
        
         | jeremyjh wrote:
         | Yeah, honestly this should be the entire content of the
         | article. Not only do they only have two small teams but they
         | all overlap completely anyway. There is no reason even a
         | significantly larger org - say 40+ people in 8-10 teams cannot
         | work effectively in a single repository and monolith
         | architecture. Beyond that there are certain growing pains and
         | if you don't effectively manage those then I could see how you
         | end up going with micro-services.
         | 
         | Beyond scaling a large development org the primary benefits of
         | micro-services accrue to consultants who bill by the hour.
        
       | dvt wrote:
       | A few points I'd like to make:
       | 
       | 1. You can't "migrate" to microservices from a monolith. This is
       | an architectural decision that is made early on. What "migrating"
       | means here is re-building. Interestingly, migrating from
       | microservices to a monolith is actually much more viable, and
       | often times just means stick everything on one box and talk
       | through function calls or IPC or something instead of HTTP. Don't
       | believe me? See this quote:
       | 
       | > The only ways we could break down our monolith meant that
       | implementing a standard 'feature' would involve updating multiple
       | microservices at the same time. Having each feature requiring
       | different combinations of microservices prevented any
       | microservice from being owned by a single team.
       | 
       | Once something is built as "one thing," you can't really easily
       | take it apart into "many things."
       | 
       | 2. Microservices does _not_ mean Kubernetes. The idea that to
       | properly implement microservices, you need to set up a k8s
       | cluster and hire 5 devops guys that keep it running is just flat-
       | out wrong.
       | 
       | 3. Microservices are "antifragile," to use a Talebian term. So I
       | think that this paragraph is actually incorrect:
       | 
       | > This uncertainty made creating microservices more fraught, as
       | we couldn't predict what new links would pop up, even in the
       | short term.
       | 
       | A microservice is way easier to change (again, if designed
       | properly), than a huge app that shares state all over the place.
       | 
       | 4. What's the point here? It seems like the decision was hasty
       | and predictably a waste of time. Any CTO/architect/tech lead
       | worth his or her salt would've said this is a bad idea to begin
       | with.
        
         | edude03 wrote:
         | > Microservices does not mean Kubernetes. The idea that to
         | properly implement microservices, you need to set up a k8s
         | cluster and hire 5 devops guys that keep it running is just
         | flat-out wrong.
         | 
         | You don't need to use kubernetes but I strongly believe it's
         | the best choice if you're not using FaaS. If you pick nomad or
         | bare vms you'll spend a lot of your time building a framework
         | to deploy/monitor/network/configure etc your services whereas
         | kubernetes has "sane" defaults for all of these
         | 
         | That said - you should use managed kubernetes and not deploy it
         | from scratch
        
       | notyourday wrote:
       | Do you have an auth service that does not do API? Does your API
       | ask the auth rather than reaching into the auth table to see who
       | is authorized? When you send an email, do you do it inline or do
       | you trigger a push to a queue with separate worker(s)? Does your
       | externally accessible API talk to internal services using a
       | predefined protocol rather than reaching directly into a
       | database?
       | 
       | Congratulations, you have micro services!
       | 
       | As someone who have driven the migration from a monolith (just
       | set environment variables and magically the same codebase becomes
       | auth, notifications, workers, web and API and the same codebase
       | reaches into every single database and talks to every single
       | service) into micro services because a simple features were
       | taking months to implement, I can confidently say that even
       | today, in 2022, an average organization does not have the tooling
       | or the team to do a monolith. Monolith is a cargo cult. Break
       | stuff into an digestable chunks, externalize your own internal
       | libraries if they are shared, version the interfaces and stop
       | worrying about microservice complexities.
        
       | joatmon-snoo wrote:
       | Monolith vs microservice is not a dichotomy, it's a spectrum (as
       | it is with so many other things). Individual microservices can
       | still become monolith-y and become responsible for doing a Lot of
       | Things (TM).
       | 
       | That being said, the biggest hurdle in a re-architecture project
       | like this is usually in the "n=1 -> n=2" stage, and "n=2 -> n=5"
       | is a lot easier: once you add service #2, you learn how to set up
       | telemetry, permissions, billing/chargeback, alerting, etc. The
       | next few are just repeating the same process.
        
         | jedberg wrote:
         | I always say n=2 -> n=3 is the hardest step, then n=1 -> n=2.
         | With 1 to 2, you can take a lot of shortcuts with the n's
         | communicating directly. With 3, you have to start formalizing
         | message transmission either through a message bus or a cache or
         | whatever. But once you have n=3, n=3+ is pretty easy as it's
         | mostly edge cases to solve for or geometric scaling problems.
        
       ___________________________________________________________________
       (page generated 2022-01-25 23:00 UTC)