StabbyCutyou
Joined 11 years ago
Joined 11 years ago
Would love to chat about the product if folks have any questions!
Just because TCP provides resilience doesn't mean that you're perfectly defended against all kinds of issues here.
I'm mostly talking about things in the category of bugs in the software layer using TCP (the drivers, the consumers/publishers, race conditions, batching messages, not receiving ACKs, etc). There are a lot of little things that can go wrong.
In terms of partitions, look up a series by a guy named Aphyr called "Jepsen". It goes over the CAP theorem as it applies to distributed datastores and queues. His examples and tests will demonstrate the concepts behind partitioning better than I can explain over a HN comment :)
And yes, these types of failures are implicit everywhere - but every additional layer you add, every hop in the chain, every interaction added to the request flow increases the surface area for problems. Especially once you push high scale with hundreds of nodes, become nic or cpu bound, etc etc.
There is a lot to unpack here, and it's not as simple as it seems on the face of it.
You certainly can do it that way, and there are lots of benefits, but queues (and if you're doing this at scale, distributed queues) are an entirely distinct subject matter that I chose not to touch on for this.
Also, things can still get lost with queues. Network failures, partitions, bugs in your own publishers and consumers... nothing is fool-proof, and it takes a lot of work to reduce that loss rate to 0.
1. I don't think microservices are bad, or that they don't work. Quite the contrary. My argument is simply that there is a lot of additional complexity in using this approach to your architecture, and to consider if you're able to handle that before diving in.
2. This was adapted from a lightning talk I gave almost 2 years ago, and is almost by-design light on hard details or deep dives. It was meant to just introduce the problems by talking about fallacies (which many think are strawmen, but they're arguments that i've heard from people in my own discussions on the subject).
3. Even if you disagree with my points, I appreciate folks taking the time to read and provide feedback.
Thanks!
Quickly, on the "elementary" nature of the post, this was adapted from a lightning talk I gave, and so it was sort of designed to be a very quick introduction into the problem space.
Also this was meant to be (and this is my own fault for maybe not more carefully spelling this out) aimed at people just starting out with a new project or endeavor, as a warning that "just sprinkling some microservices on it" is not a magical panacea for scalability or good software design.
Thanks for taking the time to read and comment!
The perfect solution for Go.
That's a pretty high level answer, but in general that's the most difficult to wrangle with over time, in my opinion.
To give a more concrete answer, every slack instance and the way people configure it can be a little different, and in some cases we found it tricky to find the right consistent location to pull information like display names from.
In terms of what is unexpectedly easy, Slack themselves been great at giving us feedback and advice for building on their platform!