GoodData: breaking a monolith into microservices
Chief among the products and processes appealing to developers are microservices, containers, Kubernetes and Continuous (Integration & Deployment) with a focus on automated testing.
Embedded BI and analytics platform company GoodData is at the tail end of a major project, which has taken months instead of years, thanks in large part to the groundwork laid by some of these linchpins of modern software development.
Senior manager at GoodData Michal Vančo notes that each microservice has its own stack and components are organised by their function or capabilities.
Applications can be built from scratch in this model, or an existing ‘monolithic’ application can potentially be broken down into microservices – either all at once or in strategic pieces.
Vančo notes that his firm’s experience involved breaking down its existing platform into microservices.
“In theory, each developer could have built each specific function in the language they wanted, but that can get a bit tricky in the end. We decided to go with the open source Kotlin programming language, which was appealing to our developers for many reasons. For example, they can just extend the definition of a service, such as messaging, with a library and some minor configurations or annotations of some classes,” said Vančo.
The GoodData team used Docker to ‘containerise’ these microservices for application types including core service, function, API and UI app. As we know, developers appreciate container technology because it separates work on the application from work on the infrastructure. Containers also reduce the need to do the same thing many times over.
When it’s good, it’s really good
Noting that the microservices/container model does not make sense for every application or for every development team, Vančo says that when it’s right, it creates a virtuous cycle that benefits the business by benefiting developers.
The team had been relying on Kubernetes from the beginning of this journey for managing its containerised workloads.
“However, while a few containers may be manageable, containers can multiply quickly and become unwieldy. Kubernetes orchestration takes care of scaling, failover, service discovery, load balancing, storage, resiliency and configuration management, among many other functions,” said Vančo.
When his team started working with Kubernetes, it used the vanilla version, but they have since added use of the managed version via AWS Elastic Kubernetes Service. They are now using the vanilla Kubernetes version for private cloud deployments.
“With our Continuous Deployment pipelines, we’ve moved from deploying a monolithic application every 14 days to delivering isolated changes to microservices an average of 10 times a day. Of course, this process relies heavily on automated testing. In fact, microservices and containers introduce a layer of complexity, especially as those elements scale and as they are called by applications in combinations,” said Vančo.
Automated testing
Through this whole project and the one that preceded it, the team put an emphasis on automated testing, with the goal of catching issues as soon as possible in the DevOps cycle and providing immediate feedback to the development team.
“This is good for the application and for customers, of course, but it’s also beneficial to developers, who can remediate in the moment rather than backpedaling to figure out when and why something happened,” said Vančo.
The company’s current developer experience is binary: so the pull request with change is either merged, delivered to all our environments or not merged, which means that some issues appeared on the way, but were immediately visible to the developer.
“About a year ago we started using consumer-driven contract testing, a method that evaluates the “contract” between the consumer (such as a client) and the producer (such as an API). This process enables us to ensure that services can effectively communicate with each other as they are deployed along the CD pipeline,” said Vančo.
Finally here, the team are using the open source Jenkins Pipelines platform for the SaaS platform and GitLab CI/CD for the GoodData Anywhere project to automate development, testing and deployment processes.