What I Wish I Had Known Before Scaling Uber to 1000 Services • Matt Ranney • GOTO 2016
Video Statistics and Information
Channel: GOTO Conferences
Views: 278,159
Rating: undefined out of 5
Keywords: GOTO, GOTOcon, GOTO Conference, GOTO (Software Conference), GOTOchgo, GOTO Chicago, Matt Ranney, Uber, Voxer, Always On, Scaling Software, Computer Science, Videos for Developers, Microservices, Software Industry, Software Engineering, Software Development
Id: kb-m2fasdDY
Channel Id: undefined
Length: 46min 38sec (2798 seconds)
Published: Wed Sep 28 2016
Please note that this website is currently a work in progress! Lots of interesting data and statistics to come.
Most of these problems are why I haven't jumped into full out microservices and I don't plan to do so any time soon. I mean, for a small scale platform it is just not possible to build the necessary infrastructure to handle all of these issues because you would spend more time on infrastructure and supporting tracing, context propagation, logging, deployment, etc. systems than on actual features.
I was expecting some talk about distributed transactions (is this the proper name?). When you have a chain of calls and somewhere along the way something goes wrong, how do you revert these changes on the previous links of the chain? Is this a solved problem and I don't know?
There are a lot of comments here and on HN about how 1700+ services seems insane. I think they're missing the point of the talk.
Look at all of his WIWIK points. They're all people related. Every one of them.
You don't get to 2000 services because the technological needs of the system demand it. You can be guaranteed there are overlapping concerns between many of the services. They probably aren't well-planned.
You get there because you're hiring people non-stop. You can't train all these people on your Perfect Way to design and interface with Uber services. Even if you did, they all have conflicting opinions on how to do things. Some people would just ignore your advice; did you miss the part where he said "mandates are bad" and "I would use carrots 99% of the time over sticks".
Having 1000 engineers does not mean your company is churning out engineering related features 1000 times faster than if you had one engineer. In reality, there are reasons why it might be more, and there are reasons why it might be less. But, if your product concept is big enough to support another engineer, then it is practically guaranteed that, with the right management structures in place, adding another engineer means you will get some positive return on productivity.
Some people, when confronted with a library versioning and boundary problem, think "I know, I'll use microservices." Now they have 1000 problems.
Out of curiosity, is there a TL;DR anywhere? I'd love to watch this but can't at the moment...
I worked at a place that made relatively mediocre insurance agency software. They fucking LOVED microservices. I still to this day, do not understand why they thought they needed 350 services for what was essentially a crappy CRM.
You can also build things that are partially monolithic, but built as microservices inside (modularity!), and routing rules that know whether you can use the in-process service, or need to use a remote service.
In this way you can keep your projects light and fast to develop, and not incur the penalty of continually traveling over the network at every step of logic or data gathering.
EDIT: To expand on this slightly, the internal micro-services can be treated in the same way as external microservices, so that they can later be split out of the "monolith" if that is required, and eventually it will be for various reasons as things scale. Some other things may be able to be migrated in, which were originally separate, if they were built under the same principles. In this way, they are working through an API that is available locally or remotely, and functions in the same way in either case. This is how modularity like this is possible, and it is how things can be moved into or out of a "monolith" as needed. It's the ability to route effectively (this node, or another node? Node being a process, in this case, but could also just be local host TCP/etc) that allows this to happen, and with enough intelligence in the design of the system, the same monolith may sometimes be able to take requests for a given service locally (cached data, or the appropriate node to request from), and other times may have to communicate with a different node for the same service (remotely cached data attempt).
Then how to route requests to the appropriate nodes make this work, and the standard ring-buffer or modulus-partitioning methods can be used.
A very good talk, IMO. He illustrates the problems I had with the microservices religion in a previous thread.
Use the right tool for the job. Sometimes that is microservices, but not always. Microservices doesn't magically fix spaghetti code, it simply changes it to a different problem.
Question here: "How do they / or you do service discovery for developers? What I mean is that if I'm a developer writing a new service that needs to do certain computations that might already be implemented by another micro-service, how can I organise my services so as to find them easily?".
This sounds like a nightmare.