Live data from Hacker News

Ask HN: Why Not Microservices?

news.ycombinator.com

21–30 of 30 posts

Re: Ask HN: Why Not Microservices?

#21
In my experience, microservices are an emergent property of Conway's law [1], essentially that a system's architecture will tend to ship it's team(s)' communication structure. The biggest bottleneck to software engineering is communication between engineers, especially as teams grow beyond 3+ people working a single system. It becomes difficult to keep everyone on the same page about every design decision and change, which becomes obvious if your team does code reviews (imagine if every code change required 3+ approvals). Communication unfortunately scales O(n^2).

As a result, What makes a "team" is it's leadership structure, I.e it's determined by the number of engineers who want to be leaders (which includes accountability and ownership). If you have a team with multiple leader-types who want more ownership, and a natural seam in the solution space emerges to spin-off, they will tend to become the communication hubs for other engineers, and eventually spin out into their own subteam with their own microservice. They'll want their own abity to release when necessary, and choose dependencies without needing to convince everyone beyond their immediate subteam.

In short, if you're 1 person, microservices make little to no sense given the addition work and complexity involved. If you're more than 1 engineer, it depends on individual engineers willingness to be a lead and own a whole part of the system and become a communication hub. Companies like Google and Amazon will have lots of microservices because so many engineers want to be tech leads (either for promotion or self-fulfillment).

[1] https://en.m.wikipedia.org/wiki/Conway%27s_law

Re: Ask HN: Why Not Microservices?

#22

* more than 10 teams? -> microservices. this brings adding some guidelines: strict communication guidelines (api, events, cross team meetings) * compliance requirements? -> (micro)services. you need to host some data and workers in separate guarded environments * too many legacy third party dependencies which might fail or stop whole processes? -> wrap with service * different independent products in a company? servi…

+1 I think this is the most comprehensive answer. Default to using monoliths whenever possible. More Simple = more robust, more complex = more fragile.

Re: Ask HN: Why Not Microservices?

#23
One disastrous way microservices architectures can fail is when they stop being aligned with features and therefore stop test-driven development from working.

The promise of test-driven development is that there is a vanishing amount of code that is not under some sort of meaningful test coverage. Those tests have to target the smallest possible parts of the system to be efficient, else tests are just too brittle and slow.

Test-driven development works best for self-contained systems that represent the whole feature. Using it encourages architecturing the system in this way.

There are three environments where it doesn't work: graphical user interfaces, monoliths and distributed systems. The biggest issue with these is the huge state space to test and their comparative slowness. Also, they are usually expensive to set up and maintain.

Re: Ask HN: Why Not Microservices?

#24
While I agree that microservices don't make sense for every use case and definitely not for small companies/platforms, I've done the monolith thing over and over again and for me, microservices truly are a superior platform model.

Yep, they introduce some new problems and by definition, more moving parts but if you're doing anything halfway complicated or "at scale", this is the only sane way to do it.

Docker was hyped a lot but it's a net win for me and for a good chunk of the industry. SPAs with pure API backends are better too. For me and what I do. I love using software defined infrastructure. I love when things are easy and reliable.

I love microservices.

But I also understand why many people don't and why they're a bad fit for some use cases. In some ways, they're kind of like NoSQL databases. If you're just doing microservices because they sound cool and modern, you're like all the folks who use MongoDB and complain that it doesn't work like Postgres. And then talk endless crap about MongoDB.

You're the problem. Not Mongo. Not Postgres. Not monoliths. Not microservices.

Re: Ask HN: Why Not Microservices?

#25
I think where people get into trouble is when they try to implement a true microservice architecture without actually understanding the tradeoffs and complexities. You will likely end up with a spaghetti rube goldberg mess with weird service dependencies.

I also think people tend to strive for too much purity. It's okay if you want to avoid the replication and event bus complexity of microservices and choose a monolith-esque database architecture. Just split your APIs across business domain, leave your database as it is, and be done with it.

Just make sure you stick to the fundamental principles of microservices. Scoped, fault tolerant, independently deployable. Fault tolerant does not 100% have to include database failures. Don't ever directly cascade API calls from one service to another.

The biggest "why not" is that you should choose the architecture that best solves the problem. Don't treat architecture as a playground to try out random shit. Solve the business problem in the simplest way possible. In most scenarios you probably don't need isolated, fault tolerant, distributed services. I would guess that 75% of microservices implementations fall under the premature optimization anti-pattern.

Re: Ask HN: Why Not Microservices?

#26

While I agree that microservices don't make sense for every use case and definitely not for small companies/platforms, I've done the monolith thing over and over again and for me, microservices truly are a superior platform model. Yep, they introduce some new problems and by definition, more moving parts but if you're doing anything halfway complicated or "at scale", this is the only sane way to do it. Docker was hyp…

Between the monolith and the microservice architecture, there is the SOA (Service Oriented Architecture).

At Link Society[0], we're building a SaaS offering for one of our product (Kubirds[1]), the architecture is as follows:

  - A payment service (with Stripe)
  - An IAM service (with Kratos[2])
  - A Deployment service (which interacts with Kubernetes)
  - A Dashboard backend service (with Hasura[3])
They are not "micro" at all, but each their own task nonetheless.

  [0] - https://link-society.com (fr)
  [1] - https://kubirds.com
  [2] - https://www.ory.sh/kratos/
  [3] - https://hasura.io/

Re: Ask HN: Why Not Microservices?

#29
post #16

Earlier quoted context omitted.

If a service A going down brings service B down, then microservices aren't divided right and/or too much data is being shared over the network rather than async transformed/copied. The only time this should matter is if there's a breaking change to the way services communicate which should be very well known, e.g. having to bump a protocol version number with downstream understanding before upstream.

Yeah, everyone knows this. The question as I understood it, was to ask what are some downsides to microservices. And that, to me, includes how they are implemented and managed in the real world, rather than some perfect hypothetical world where everyone did everything by the book.

There is no such hypothetical book. I've read many of them and collectively don't cover what you'll need to know or do. There's also very few things everyone knows about microservices. Choosing the right bounded contexts is the biggest knowledge gap and most examples talk about noun1 service and noun2 service.

Learning about microservices by reading books that distill it into abstract examples is like learning Haskell by reading about category theory. Maybe possible but challenging and not for everyone.

Re: Ask HN: Why Not Microservices?

#30
I don't see anyone mentioning a definition of microservices... How can you talk about it if you don't define it?

I've split up an application for a project into separate containers with docker-compose. They shared some environment state with a dotfile. I don't have to reinvent the wheel and can just pull some services into it and tag them so I can easily rollback and roll forward. I can offload storage with Docker's storage driver. The services talk through sockets, so it's easy to verify the uptime. The services are implemented in different languages, because I don't believe that there exists one golden language that can solve all problems.

Is that microservices? I don't know, but it works really great and it doesn't feel like there's any overhead.

Another example. I work in a team where two services use JSON schema validation, and they can't be reconciled. Agreement between schemas takes so much overhead, because there are different expectations, leading to 90% of the time discussing schema changes in pull requests.

Post reply on HN