Audiogum Architecture Overview
An overview of the Audiogum system architecture - what we’ve been building and how we go about it.
We started Audiogum just over a year ago with the aim of making a cloud platform that could offer hardware manufacturers a way to quickly integrate multiple content services, easily gather data on their devices and offer differentiating features to get their customers coming back to listen again.
Having worked together for many years at Nokia and MixRadio, we were able to hit the ground running on our first day. We brought many ideas from our previous experiences together, quickly outlined the high-level architecture and toolsets and took advantage of the clean-slate to improve various areas of design and technology.
The Audiogum platform is a collection of over forty microservices, each responsible for individual areas of functionality. The microservices architecture allows us to change and improve our platform quickly, and tests around each service allow us to prove we will not impact the overall platform. Each service shares common attributes such as being independently scalable and including support for monitoring.
As part of our lean Continuous Delivery process, each service is tested in isolation and then as part of an overall regression test suite that we run every few minutes to drive our alerting. We host the services on Amazon Web Services (AWS) in Europe and Beijing with some proprietary data synchronisation between the data centers. Microservices architecture and AWS hosting are approaches our team have used for many years, however we now use Kubernetes to allow us to run many services on each AWS host and maximise efficiency.
Areas of responsibility our microservices have include: user accounts, device registration, analytics event capture, voice command transcription, playlist generation, content search and integration with individual music services such as Tidal, Napster and KKBOX.
The microservices that comprise the platform are exposed to the outside world through a configuration-driven service that proxies the internal APIs and adds security - enforcing authentication and permissions.
The clients that access the Audiogum platform are typically apps controlling audio devices or the firmware running on audio devices themselves. The apps can be developed by our partners or by us, as one of the services that Audiogum offers is app development.
We develop iOS and Android apps using Xamarin - cross-platform development tooling that enables us share code to access our API and interface with devices across mobile platforms, whilst taking advantage of OS-specific capabilities and user interfaces. This allows us to develop features across multiple platforms very rapidly.
Traditionally, building apps for iOS and Android has meant not only mastering different tools and technologies, but also entirely rewriting the app for each different target platform. Xamarin allows us to take a single codebase and configure it differently for each target platform. In some cases creating different user interfaces, but always using a shared core that defines the behaviour of key features.
This helps us to not only create mobile apps, but also to target desktop, IoT and TV platforms such as Windows, Mac OS, Apple Watch and Android TV. Along with the reduced overhead of development and testing, this approach helps to ensure a consistent experience in whichever way users choose to use our software.
Our in-house design team help us deliver great user experiences, not just from their own experience and opinions, but from interacting with real users and testing their theories. Tools such as Zeplin make their latest designs instantly available to our app developers. Our commitment to Continuous Delivery helps us roll out new versions of our apps frequently throughout the working day, while our many years experience of agile software development ensures that delivering customer value is at the forefront of everything we do.
We like to use the right tool for the job, using open source technologies. The following is a list of technologies that we’re actively using.
- Clojure for our microservices
- C# for our apps
User Interface Design
- Sketch to design UI and UX
- Zeplin to distribute designs to engineers
- PhraseApp to manage localisation
- MySQL and AWS Aurora for offline catalogue data
- Elasticsearch for search
- DynamoDB for various data stores
- Elastic Map Reduce for crunching analytics data
- AWS in Europe, US and Beijing for the platform
- Kubernetes for microservice container orchestration
- GitLab Community Edition for source control
- Jenkins for builds and deployment
- Bitrise CLI for app deployment pipelines
- Packer for building standalone machine images
- Terraform for infrastructure provisioning
- Influx for metrics capture
- Kibana for log analysis
- Status.IO for Status Reporting
- OpsGenie for Incident Management
We were always confident of being able to deliver what we set out, but it's great to see our global, scalable platform serving real users and enabling us to deliver great new experiences that will be revealed soon.
Hopefully this post gave you a flavour of how we build our platform and apps; look out for more detailed follow up posts.