Scaling your start-up
We built VaycayHero around 5 years back, our initial code was to just to deliver an MVP (minimum viable product). But as the product market fit achieved and we start seeing the revenue growth, we realized that our monolithic code will not be going to stand too long. We have a bigger team now and being the technology head, my challenge was on how we scale the product without disrupting the production. In theory, we learned on designing a scale product from scratch, but our challenge was that we have written lots of business code in the old way. At that point, we have decided to build a 2.0 version so that it can scale with future demand.
We have adopted engineering best practice for v2.0 which were evolved from building v1.0 experience:
We have added “Designed for scale” as part of our best practices so that we think about this for anything we build. Looking at various option to scale the product, we have decided to move with Microservices approach[I will write another story later on the decision-making process].
As we have decided the approach, our most important challenge in hand is to how to decompose an application into microservices. Just to give you a background, VaycayHero was a travel tech platform to make it easy to property managers to market their listings to various channels. We have listed down every business capabilities that we use in the application and the usages of it. Based on the dataset, calendar management, price quotes, and review, the search is the most used business capabilities identified. We have decided to define the service boundaries around it.
The team structure is very important aspects of successful microservice implementation, so we have redefined our team formation. Being a small team and managing a revenue-generating the application, we decided to start small so that we can learn and follow a similar pattern for the rest.
Build & Deployment Changes:
These services can be developed by small teams using the technologies which are best suited for each purpose. We are using, Lambda in Java with a MySQL database for price quote service, a listing review service with node and calendar management service with Lambda with a custom framework.
Once developed, CI/CD pipelines are set up with Jenkins CI servers to run the automated test cases and deploy these service independently to different environments.
We have spent a good amount of time on writing automated test cases per our best practices which were very helpful in the long run.
Collaboration is the key while managing microservices team. We have used slack heavily to discuss on-going challenges and communication. Agile development methodology really played a key role to make sure we are delivering value in a progressive manner and learning from the failures through retrospective meetings. We have improved our velocity significantly and also able to deliver values. Reporting structure shaped up around these teams and able to do an alignment on how to structure a team around a microservices [may be another topic].
With microservices, we have reduced our production environment cost in aws by 15%, which was great for a company like our size. We are using Lambda effectively and the smaller machines for some services which helped to reduce the price with better scale. It also helped to scale up only these services based on the load with auto-scaling.
It is a better idea to adopt the microservices architecture quicker in the start-up at least as soon as one has a better idea of the service boundary context. We took some time to move to this, but it’s better late than never.