GoWithFlow chooses Quarkus to deliver fast to production with minimal risk

GoWithFlow, a recent startup based out of Portugal, a spin-off from CEiiA with Galp as a majority shareholder, provides integrated mobility solutions that can both provision end-to-end services to new mobility operators (eg. running a scooter-sharing network, managing an EV charging network, managing a fleet), but also gather data from other mobility operators, e.g.car-sharing operators, public transportation, etc, and thus provide a single access to mobility within a city. They consolidate all this data for consumption by citizens via their mobile phone apps that can help them locate the closest shared vehicle, or the most optimal way to get from point A to point B using multiple transportation options, for example.

They had a monolithic application server to support all their apps and their developers were experiencing 2 to 3-minutes deploy cycles to test any change made to the code. In addition, it was taking them 2 to 3 months to go to production every time there was a change, no matter how small it was, which required them to deploy the entire system - even parts that had not been modified at all - making the whole process highly risky.

GoWithFlow is in the process of moving their workloads to containers on the cloud so cloud resource consumption costs are always top-of-mind and they are always trying to find better ways to optimize memory and compute usage on the cloud.

Lower cloud resource consumption

When Raul Valdoleiros, Architect and DevOps Leader at GoWithFlow, first heard of Quarkus, he was extremely interested in its capabilities and features. They looked at other similar solutions in the market but after evaluating Quarkus, they decided to move forward with it. In comparing it with their existing monolithic solution, they realized the enormous memory savings introduced by Quarkus, 79% reduction in memory consumption under load, to be exact. The following table shows the results of their evaluation:

Table 1. Evaluation results
Runtime mode RAM at startup RAM with load

Monolith

1.3 GB

1.5 GB

Quarkus JVM-mode

90 MB

800 MB

Quarkus native-mode

11 MB

320 MB

Rich functionality with small learning curve

Besides its low memory consumption and lightning fast startup time, GoWithFlow selected Quarkus because of the rich set of frameworks, extensions, and rich functionality included with it. Raul describes Quarkus as "an incredible integration project that includes functionality, like MicroProfile, Vert.x, Kafka, and Keycloak, and many others."

Because Quarkus extensions are composed of frameworks and functionality that GoWithFlow developers already knew, it was very easy for them to learn and quickly become productive. Although Quarkus introduces innovative technology for running Java on the cloud and containers, developers found it familiar and were able to pick it up with a small learning curve because all its extensions were familiar to them. Nevertheless, they did spend some time familiarizing themselves with aspects related to native images and features for which Quarkus did not yet have extensions.

The prototype

Once GoWithFlow selected Quarkus for Java development, they started a prototype project, which consisted of the implementation of 4 microservices. Using the Quarkus built-in testing harness, developers implemented automated tests, which are run during build time in both JVM and native modes. They also optimized the pipeline processes to avoid any human intervention during the deployment to production, where the microservices run in native mode. Integration testing consists of launching the application and testing the entire system through the web interface, which invokes the Quarkus microservices. All this work was accomplished by 3 developers from their Architecture team and GoWithFlow is very happy with what they have accomplished so far.

Developer Productivity

GoWithFlow had been running their application in a monolithic application server. This meant that they had to roll out the entire application to production even if a small change had been applied to it. Besides being time consuming with releases taking 2 to 3 months, they felt that this was risky because they had to constantly release code that hadn’t been modified. In addition, developers had to wait 2 to 3 minutes to see their changes while they waited for the deployment of their changes to the application server. These lengthened the development process, which negatively impacted developer productivity and their ability to innovate and stay ahead of the competition. They worked on speeding up their development process and a key element that helped them accomplish this was the container-first approach of Quarkus. Now, they no longer have to wait months for production releases. In addition, developers can now use Quarkus live coding capabilities to test their source code changes immediately, which saves a lot of development and troubleshooting time, as described by Raul “live coding is one of Quarkus best features if not the best one.”

Future plans

GoWithFlow currently delivers every week to production and are working on optimizing their development process with the goal of achieving continuous deployment in the future. As part of this work, they also plan to continue to break their monolith into Quarkus-based microservices by having the entire development team dedicated to this effort, a total of 10 developers. This team will also continue to develop new functionality in Quarkus.

"Quarkus including MicroProfile was very important to us" Raul mentions when referring to their use of MicroProfile Health, MicroProfile Config, MicroProfile Fault Tolerance and MicroProfile Rest Client extensions. In the future, they plan to use MicroProfile OpenTracing to visualize requests that traverse different microservices and this is a key functionality to them.

GoWithFlow is happy with what they have accomplished so far with Quarkus running in production in native mode and continue to collaborate with the community to foster its innovation.

For more information on Quarkus: