A Long Journey into a Microservice World

Starting Small

The HMS President by Roger Marks
Hailo’s original PHP and Java based application

Going Global

Part way through our migration to a Service-Oriented Architecture

“My God! It’s full of stars!”

Technically this isn’t when Dave goes through the monolith, but point stands — he’s got a long journey ahead
  • Our driver-facing infrastructure was still deployed on a per city basis, so expansion to new cities was complex, slow, and expensive.
  • The per city architecture had some single points of failure. Individually these were very reliable, but they were slow to fail over or recover if there was a problem.
  • Compounding this, we had a lack of automation; so infrastructure builds and failovers usually required manual intervention.
  • Our services were larger than perhaps they should have been, and were often tightly coupled. Crucially while on the surface they provided a rough area of functionality, they didn’t have clearly defined responsibilities. This meant that changes to features often required modifications to several components.
Changes often touched several components

Changing Gears

A Cloudy Beginning

“Construct a highly agile and highly available service from ephemeral
and assumed broken components”

Hailo’s Microservice Platform based around RabbitMQ and Cassandra

But, what even is a Service?

“The microservice architectural style is an approach to developing a single application as a suite of small services … these services are built around business capabilities and are independently deployable … there is a bare mininum of centralized management of these services, which may be written in
different programming languages”

Developers, Developers, Developers

Components of a Service
Services as a Service. Seriously, it’s turtles all the way down.

Always be Shipping

The Provisioning dashboard for an environment
Simple Global Provisioning
Simple Provisioning with Docker
Services automatically discover RabbitMQ and publish their existence
Once discovered, services are bound to RabbitMQ and receive messages

Dealing with Complexity

Rise of the Machines

Running a simulation of Dublin, while terminating nodes and simulating random latency
Continuous production testing in Kerguelen


Services publish healthchecks to a Monitoring Service
Monitoring dashboards auto-generated for all discovered services


Before trace analysis this call had performance problems
Optimised execution after trace analysis, with service calls executed in parallel
Health is indicated by colour, and relative traffic by arc width

Conclusions, aka TL;DR.

Further reading

Image credits




Skier, Boarder, Gin explorer. Engineering @monzo, formerly @hailo.

Love podcasts or audiobooks? Learn on the go with our new app.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store
Matt Heath

Matt Heath

Skier, Boarder, Gin explorer. Engineering @monzo, formerly @hailo.

More from Medium

Focus Is A Superpower In A Very Distracted World

How to mix vocals for the best outcome

9 Ways to Inspire Creativity

A Black woman with curly hair painting on a wooden canvas. She is wearing a white plaid shirt with grey stripes.

Homage to the Elevator Ride

Elevator Ride