This article was written by Christain Maritnez
from the AzureCAT team.
Application Request Routing
(or ARR) is probably one of the least talked about but critically important technologies used across Microsoft and helps power things such as Windows Azure Web Sites
, Outlook.com, and many other high volume, critical applications. It stands to reason, then, that using it directly in Windows Azure applications is discussed even less. We used it in Cloud Service Fundamentals because one of the patterns CSF shows is splitting work among multiple cloud services and transparently creating an affinity to a cloud service based on the user. This approach is based on prior experience with large customers where cloud services were used as scale units and where having high locality (data is close to the code using it) offered performance benefits . ARR is a natural fit to help us meet the requirements.
At first when you hear multiple Cloud Services you might say, “Hold on second…So you have multiple cloud services. Just use Windows Azure Traffic Manager
(WATM)”! Indeed, for most routing needs when you have split work among multiple cloud services for either performance or business continuity reasons WATM is probably the right choice. In this case, however, it did not meet the requirements. WATM offers three methods
of load balancing:
- Round Robin
Those are great but none of them meet the requirement of sending a user to a cloud service based on who they are (as determined by a cookie).
To use ARR we needed 4 things:
- A Windows Azure Cloud Service comprised of Web Roles to host ARR
- A script to install and configure ARR
- Configure ARR rules
- Decide what to do in the case of a user not having a cookie from a previous visit
The details and code for all of which can be found here
. Most of these steps are generic to any solution leveraging ARR on Azure so I will only discuss the two CSF-specific parts here:
- Route-by-Cookie rules – What did an ARR routing rule look like for CSF?
- No cookie present – What did we do when there is no cookie and how we did it.
Route by Cookie Rules
The logic to route a user by their cookie looks like this:
Rule configuration is can be a somewhat complex topic
but the logic above basically says in English:
If the request is over SSL and is a relative path and contains a user cookie of form userpod=(some number), then capture the part of the cookie after the equals sign and rewrite the destination URL by injecting that captured value.
Sure, it can look a little strange but you will get used to it after a while.
No cookie present
But what do you do in the event that no cookie is detected? There may be several ways to solve it but we decided to create a class which implements two interfaces, IRewriteProvider and IProviderDescriptor
. The first interface allows you to use code to return a custom URL based on the request inputs and the second allows you to provide for a simple configuration of your custom inputs. Our code for the provider simply took the configured pods and chose among them in round robin fashion whenever a request without a cookie came in. This is not exciting code in that it amounts to incrementing an integer and then circling around when you hit the last spot.
The configuration code is slightly more interesting -- but not by much:
This results in a grid where for a given pod you can enter a URL. So, the net effect of all this was we had code that was configurable with a set number of addresses to choose if no cookie was present!
ARR is a powerful tool used widely across Microsoft. This blog gave you the reasons why we used it for the CSF scenario but this scenario only scratched the surface of what ARR can do. For example, one common use we have seen for it is within
a cloud service so that routing and load balancing are available in any pattern desired. It’s great if WATM or some other pre-built service can meet your needs but if they can’t don’t overlook this powerful and versatile option.