Traditionally it is considered a good practise to have REST API versioning like “/api/v1/xxx” and when you transition to next version of your API you introduce “/api/v2/xxx”. It works well for traditional web application deployments where HTTP reverse proxy / load balancer front end exists. In such set up application-level load balancer can also work as an HTTP router, and you can configure where requests go. For example you can define “v1″ request go to one rack, “v2″ to other, and static files to third one.
Cloud services tend to simplify things and they often don’t have path-based HTTP routing capabilities. For example Microsoft Azure does load balancing at TCP level. So any request can hit any VM, so your application needs to be prepared to handle all types of requests at each VM instance. This introduces a lot of issues:
- No isolation. If you have a bug in v1 code which can be exploited all your instances are vulnerable;
- Development limitations. You need to support whole code base making sure ‘v1′ and ‘v2′ live nicely together. Consider situation when some dependency is used in both ‘v1′ and ‘v2′ but require specific different versions;
- Technology lock in. It either impossible or very hard to have ‘v1′ in C# and ‘v2′ in Python.
- Deployment hurdle. You need to update all VMs in your cluster each time.
- Capacity planing and monitoring. It is hard to understand how much resources are consumed by ‘v1′ calls vs. ‘v2′
Overall it is very risky, and eventually can become absolutely unmanageable.
Cloud aware approach
To overcome these and probably other difficulties I suggest to separate APIs at domain name level: e.g. “v1.api.mysite.com”, “v2.api.mysite.com”. It is then fairy easy to setup DNS mapping of the names to particular cloud clusters handling the requests. This way your clusters for “v1″ and “v2″ are completely independent – deployment, monitoring, they can even run on different platforms – JS, python, .NET, or even in different clouds – Amazon and Azure for example. You can scale them independently – scale v1 cluster down as load reduces, and scale v2 cluster up as its load increases. Then you can deploy “v2″ into multiple locations and enable geo load balancing still keeping “v1″ legacy set up compact and cheap. You can have ‘v1′ in house, and ‘v2′ hoste in cloud. Overall such set up is much more flexible and elastic, more easy to manage and maintain.
Of course this technique applies not only to HTTP REST API services but to others as well – HTTP, RTMP etc.