That is one of the reasons I found it beneficial last week to attend a meeting for our .NET group From a Monolith to a Scalable Application, by Marc Gerritsen.
The presentation was about a project of migrating an existing financial application that manages health insurers declarations.
I had there a few questions for myself and I was specially interested in the 'how' part of their solution: How did you implement scaling? What was your approach? What pitfalls did you encounter?
Vertical scaling
Vertical scaling, by adding more computing resources to your application was implemented by extending the database new servers with more memory and new CPUs.There was also more which contributes to better performance:, the database is also cleaned up, by removing the unneeded columns, adding new indexes.
Solution to accomplish horizontal scaling
Horizontal scaling - adding more nodes to process the same type of requests - was implemented in multiple steps:- Decomposing the services per functional domains
- Deploying each service in a Docker container, which provides scalability
Sometimes existing component just don't work with the new technology stack. For a migration, there should be extra time allocated to solve the related issues. For example, Microsoft MSMQ is not supported in Windows containers, the messaging queue system must be replaced with a supported solution.
Lessons Learned
- For an existing application that works, a hybrid approach provides a good balance between added value and costs.
In our case, the architecture is inspired of microservices, having each service its own responsibility and deployed separately. They are sharing the same database however, so this is indeed a hybrid approach - The most widely accepted solutions might not work for you. Choose always a solution that fits your needs.