Enough with the microservices. Don’t even consider microservices unless you have a system that’s too complex to manage as a monolith.
The majority of software systems should be built as a single monolithic application. Do pay attention to good modularity within that monolith, but don’t try to separate it into separate services. – Martin Fowler If you can’t build a well-structured monolith, what makes you think microservices is the answer? – Simon Brown Much has been written on the pros and cons of microservices, but unfortunately I’m still seeing them as something being pursued in a cargo cult fashion in the growth-stage startup world. At the risk of rewriting Martin Fowler’s Microservice Premium article, I thought it would be good to write up some thoughts so that I can send them to clients when the topic arises, and hopefully help people avoid some of the mistakes I’ve seen. Microservices are still (unfortunately) currently a big thing and a tech buzzword du jour.
You are not Netflix, stop trying to be them! The Three Infrastructure Mistakes Your Company Must Not Make. When Avi Freedman was getting ready to graduate Temple University in 1992, there was no way to buy internet service in Philadelphia.
Literally. If you wanted to send someone money to get a dial-up account, there was nobody to send it to. But Freedman had already been running public access Unix machines and letting people he knew log into them. So he decided to turn his personal frustration into a company that would offer dial-up Internet access to everyone in the area. He thought, “Well, it can’t be that hard. How We Build Code at Netflix. Don’t be an Architecture Hipster – A guide. One of my more popular HN comments was a teardown of an all-too-common engineering subculture.
The article in question sought to teach “Software Architecture,” but ultimately annoyed me and many other HN readers. Tl; dr: Software architecture discussions are so polluted by software-hipsters that the majority of software engineers are disinclined to discuss and study architecture at all. Know-it-all / hipsterProbably studied philosophy, english, film-studies, or engineering.Lurks around discussions, hoping to overhear a mistake, any mistake.
Uses an unnecessarily complex vocabularyHas a self-righteous and loud tone of voice, especially when correcting people.Enjoys correcting people, even on minor/irrelevant points.If asked him a question you can be sure of two things: 1) he will never admit he doesn’t know 2) he will answer with so many niche terms that you will end up more confused than when you beganHe may be likened to Dwight Shrute, or the comic-book guy. Thus: Automating Our Infrastructure to Empower Engineers. Growing a business is hard and growing the engineering team to support that is arguably harder, but doing both of those without a stable infrastructure is basically impossible.
Particularly for high growth businesses, where every engineer must be empowered to write, test, and ship code with a high degree of autonomy. Over the past year, we’ve added ~60 new integrations (to over 160), built a platform for partners to write their own integrations, released a Redshift integration, and have a few big product announcements on the way. And in that time, we’ve had many growing pains around managing multiple environments, deploying code, and general development workflows. Since our engineers are happiest and most productive when their time is spent shipping product, building tooling, and scaling services, it’s paramount that the development workflow and its supporting infrastructure are simple to use and flexible. How We Release So Frequently. At Sky Betting & Gaming we release new versions of our code several times per day with no planned outages.
Our production environment is large and varied, but I want to focus on how we release software to our LAMP-like stack. I say ‘LAMP-like’ because although several years ago we were using a traditional LAMP stack, we’ve added other technologies as needs arise: like redis, Node.js, and MongoDB. At its heart though, there are still servers running Apache and mod_php, talking to a variety of datastores and APIs.
Our release process looks a bit like this: A release package is built and tests are run against it The package is copied to an NFS share Database migrations are run The Apache docroot is atomically switched to the new package All of this happens with the click of a single button in a Jenkins UI and takes about 10 minutes: the majority of that time spent running tests. If that doesn’t sound very impressive, that’s because it’s not. Forward-only Migrations.