It has been awhile since my last post on this … but here is the completed project – just in time for distributed cache in the Azure AppFabric! : ) In all seriousness, even with the AppFabric Cache, this is still a nice viable solution for smaller scale applications.
To recap, the premise here is that we have multiple website instances all running independently, but we want to be able to sync cache between them. Each instance will maintain its own copy of an object in the cache, but in the event that one instance sees a reason to update the cache (for example, a user modifies their account or some other non-predictable action occurs), the other instances can pick up on this change.
It’s possible to pass objects across the WCF service however because each instance knows how to get the objects, it’s a bit cleaner to broadcast ‘flush’ commands. So that’s what we’ll do. While it’s completely possible to run this outside of Azure, one of the nice benefits is that the Azure fabric controller maintains the RoleEnvironment class so all of your instances can (if Internal Endpoints are enabled) be aware of each other, even if you spin up new instances or reduce instance counts.
You can download this sample project here:
When you run the project, you’ll see a simple screen like so:
Specifically, pay attention to the Date column. Here we have 3 webrole instances running. Notice that the Date matches – this is the last updated date/time of some fictitious settings we’re storing in Azure Storage. If we add a new setting or just click Save New Settings, the webrole updates the settings in Storage, and then broadcasts a ‘flush’ command to the other instances. After clicking, notice the date of all three changes to reflect the update:
In a typical cache situation, you’d have no way to easily update the other instances to handle ad-hoc updates. Even if you don’t need a distributed cache solution, the code base here may be helpful for getting started with WCF services for inter-role communication. Enjoy!