I was the API architect on a project delivering backend services consumed by a mobile application. There were two main APIs. The configuration API was read-only, the devices called it to check for updates to settings and software. The events API was write-only, the devices posted anonymous events about user behavior, which the product team used to design the next generation of devices.
The APIs supported over 1.5 million devices. The configuration APIs needed high availability; they had to respond quickly to device calls and scale to thousands of concurrent requests per second. The events APIs consumed data from the devices and pushed events to a message queue. Listening on the queue were two sets of handlers, ...