News for hackers. Stuff that matters.
Re:How we ended up with microservices by crdoconnor on Thursday September 10, 2015 @02:23AM (#10196375)
>It makes me wonder if the "microservice" part of it was necessary. What if they had produced "microlibraries" rather than "microservices?"

I've wondered that every single time somebody has touted the benefits of microservices.

The people who have really 'succeeded' in it seem to conflate the benefits of looser coupling between dependent software systems (which is always a good thing) and making those systems talk to one another over a network socket (which isn't necessarily a good thing).

Re:How we ended up with microservices by tomchristie on Thursday September 10, 2015 @06:50AM (#10197254)
The benefits of microservices aren't architectural. The point re. library APIs vs services APIs is completely correct, because that's actually not what the microservice style addresses.

The point is rather organizational/operational - Being able to independently deploy, scale, monitor and manage different parts of the system.

That allows you to distribute ownership of the system, and also allows partitioning, so that a failure in one component need not effect the whole system.

Re:How we ended up with microservices by qznc on Thursday September 10, 2015 @08:50AM (#10197694)
organizations which design systems are constrained to produce designs which are copies of the communication structures of these organizations

—M. Conway

Re:How we ended up with microservices by laredo312 on Thursday September 10, 2015 @11:44AM (#10198702)
Could you give an example of an architectural benefit vs operational benefit?
Re:How we ended up with microservices by tomchristie on Thursday September 10, 2015 @12:31PM (#10199026)
When I say 'architectural' there I mean that as in the underlying design. How the system is modeled and and what different objects and interfaces exist in that model.

Eg. Say you have a billing component in your system. You may have the same underlying billing component in either a monolith or as microservices. It may be a nicely decoupled in both cases (either existing as an independent module/library in the monolith case, or as an independent service in the microservices case.)

The (potential) benefit that's afforded from the microservices approach is not that there's a better underlying design there, but that a single team or developer can properly take ownership of deploying, scaling, monitoring and managing the service, independently of the rest of the application. (Plus scope for partitioning and graceful partial failures vs whole system failures)

Re:How we ended up with microservices by nulltype on Thursday September 10, 2015 @03:05AM (#10196492)
Yeah I'm pretty skeptical of the benefits. It seems like better isolation within your monolithic application solves a lot of these issues, no need for a network socket.

If you can't isolate things well enough for some reason, maybe it makes sense to have separate services (maybe run them all on the same machine, deployed at the same time and talk over a local socket?), but even then I suspect you just need normalservices not microservices.

Re:How we ended up with microservices by Already__Taken on Thursday September 10, 2015 @06:20AM (#10197161)
Maybe adding the network socket makes the isolation within the code a requirement as opposed to a best practice. By this mechanism maintaining isolation is a requirement and not something someone can bypass "just this once" but fix it later.

Perhaps you're both right.

Re:How we ended up with microservices by crdoconnor on Thursday September 10, 2015 @06:46AM (#10197243)
>Maybe adding the network socket makes the isolation within the code a requirement

I've worked with microservice applications that had extremely tightly coupled services that were all highly dependent upon one another.

Adding the network socket layer just magnified the problems caused by the tight coupling.

So yeah, if you want to make your life even more miserable, split up a tightly coupled "macroservice" into a series of tightly coupled microservices.

Re:How we ended up with microservices by nulltype on Thursday September 10, 2015 @01:28PM (#10199363)
So I guess you're saying that microservices are pointless, the real problem is tight coupling?
Re:How we ended up with microservices by crdoconnor on Friday September 11, 2015 @12:27AM (#10202024)
Kind of.

There's a flood of blog posts (including this one I think) that have conflated the two, probably unintentionally. I'm happy that decoupling their systems worked out well for them. I'm not so happy this is fomenting a new fashion for creating unnecessary network API end points.

That isn't to say that you should always combine your services into one big mega-service. Just that dividing up services should be something you do only when it becomes obviously necessary and for good reasons unrelated to coupling.

Re:How we ended up with microservices by rafaelferreira on Thursday September 10, 2015 @06:53AM (#10197261)
I've tried that in the past. Even if modules aren't tightly coupled, deployment is, so different teams need to synchronize at deployment time. Resource isolation is also a big problem, if a module update introduces a performance bug, it will affect everything else. Yet another problem is keeping shared libraries in sync; if you want to update a core lib for component X, it will need to be updated (and tested) for everything else.
Re:How we ended up with microservices by Tenhundfeld on Thursday September 10, 2015 @11:17AM (#10198557)
Why is deployment coupled? Or rather, why is there a need to synchronize at deployment?

I like the idea of microservices, but I think they're overkill for most systems. By that, I mean that I see the benefits, but I think people discount the skyrocketing development and operational complexities that come with distributing a system. I heard a quote recently that "the best services are extracted from existing systems, not designed up front." I think that's right. Microservices are great IF you need them, and it's really hard to get the bounded contexts right up front with an intuitive, usable API.

Anyway, one of the benefits of microservices is that it forces you to really think about your "public" API. Any decent implementation will have some notion of API versioning. So, team A can truck along with updates, deploy them whenevs, and team B can move to the new version of A when they are ready.

Of course, supporting multiple versions is more work for team A and requires more careful planning of the upgrade path. And there will come a point when team A has to drop support for older versions. "C'mon folks, we're on version 4 of A; everybody has to move to version >=3 within 6 months." But that's just part of having truly isolated services, I think.

I don't see why you couldn't have a similar approach with versioning module API's. Right?

I think your other points are spot on. Things like performance (and error) isolation can be handled through other means, but a services approach (deployed to separate boxes, I'm assuming) makes it cleaner. And it, again, forces you to think about what happens if the dependency is unavailable. Maybe we push updates to a queue, maybe we use some async fetches here with a fallback default if we don't get a response in N MS, etc. Not that you can't do these things in a monolith, but they "feel weird" and require more rigor than most teams can maintain in the face of deadlines, i.e., it would be a whole lot easier to just call this method in this other module. Microservices/SOA force it to happen.

Re:How we ended up with microservices by crdoconnor on Friday September 11, 2015 @12:20AM (#10202006)
>I heard a quote recently that "the best services are extracted from existing systems, not designed up front." I think that's right.

Damn right. Architecture should be an emergent property of your system and built incrementally. The people who do it up front almost always do it wrong.

Re:How we ended up with microservices by crdoconnor on Thursday September 10, 2015 @07:03AM (#10197297)
>I've tried that in the past. Even if modules aren't tightly coupled, deployment is, so different teams need to synchronize at deployment time.

No they don't. There's no reason why two different teams can't schedule an upgrade of the same service at different times. The riskiness of this is entirely dependent upon how good your integration test suite is.

>if a module update introduces a performance bug, it will affect everything else.

The module will still affect everything that is dependent upon it if it is rebuilt as a microservice. You're just moving the performance problem from one place to another.

>if you want to update a core lib for component X, it will need to be updated (and tested) for everything else.

Ok, so upgrade the library and run the full set of integration tests.

Re:How we ended up with microservices by tomchristie on Thursday September 10, 2015 @11:13AM (#10198527)
> The module will still affect everything that is dependent upon it if it is rebuilt as a microservice.

Your services are running on different servers (or containers) to each other, so they're partitioned. If one service has a bug that introduces a catastrophic error that takes all the server resources you'll either:

Monolith: Bring down the service completely. Microservices/SOA: Timeouts to part of the system, and partial loss of functionality.

(Assuming you've done a decent job of engineering for partial failure)

Re:How we ended up with microservices by crdoconnor on Friday September 11, 2015 @12:36AM (#10202038)
>Monolith: Bring down the service completely.

Unless you've scaled your "monolith" horizontally, in which case it takes out one server.

If you've got a decent system, it can self heal from that and ping you via a monitoring system.

>Microservices/SOA: Timeouts to part of the system

Causing all manner of annoying behavior and difficult to track down bugs like an endlessly loading web page on a completely different system that happens a couple times a week instead of a clear error message.

>Assuming you've done a decent job of engineering for partial failure

If you assume a fantastic job done when engineering then you can make the worst architectural patterns "work". It doesn't mean that they are good ieda.

Re:How we ended up with microservices by ken47 on Thursday September 10, 2015 @01:36PM (#10199404)
There's absolutely no reason why you can't timeout within your monolith.
Re:How we ended up with microservices by tomchristie on Thursday September 10, 2015 @02:52PM (#10199847)
Indeed. But you can't guard against catastrophic system failures (out of memory, disk, processor time, corruptions) in the way you can with independant services.