Run and Enhance Client-Server Apps with Windows Azure
Hosted Software, Windows Azure November 24th, 2009In the previous post, we discussed that you can not only run some of your favorite technologies in Windows Azure but that you can easily cloud-enhance them with capabilities such as automation, elasticity, and diagnostics.
My recent post on the official Windows Azure blog introduces an example, describing how to run a client-server application (e.g. a relational database or distributed memory cache) in Windows Azure and then add elasticity to the server tier. Elasticity allows you to minimize your costs by dynamically adjusting capacity to meet demand. Let’s dig a bit deeper, diving into what the corresponding code would look like:
Service Definition
To get started, we need to define the server tier and declare an internal endpoint.
<WorkerRole name="MyServer" enableNativeCodeExecution="true">
<Endpoints>
<!-- Defines an internal endpoint for inter-role communication that can be used to communicate between worker or Web role instances -->
<InternalEndpoint name="MyEndpoint" protocol="tcp" />
</Endpoints>
</WorkerRole>
Client Code
Note that only three lines of Windows Azure specific code, highlighted below, are needed to a) initialize the client and b) reinitialize the client when server instances are added or removed.
private MyClient InitializeClient() {
var client = new MyClient();
foreach (var inst in RoleEnvironment.Roles["MyServer"].Instances) {
client.Add(inst.Id, inst.InstanceEndpoints["MyEndpoint"]);
}
return client;
}
public void Go() {
// Initialize the client
var client = InitializeClient();
// Reinitialize the client when there is a topology change
RoleEnvironment.Changed += (sender, args) => {
if (args.Changes.Any(chg => chg is RoleEnvironmentTopologyChange)) {
client = InitializeClient();
}
};
// Use the client as you would outside Windows Azure…
}
Server Code
Finally, we add one incremental line of code on the server tier, highlighted below, to discover the IP address and port to bind to.
// Discover the IP address and port assigned by Windows Azure
var ep = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["MyEndpoint"];
// Start the listener -- in this case another process -- passing in this info
var startInfo = new ProcessStartInfo
{
FileName = @".\MyServer.exe",
Arguments = "-l " + ep.Address + " -p " + ep.Port,
UseShellExecute = false,
CreateNoWindow = true
};
Process.Start(startInfo);
March 13th, 2010 at 5:48 am
Hi Mohit,
Nice post indeed. I am planning to use MongoDB with Azure. How can I run the mongoDB an executable in the Windows Azure. It needs to be run in the background all the time. I know I have to spin this through a worker role. Would you please shed some light on it and send me some code snippets or pointing me to the right url.
Thanking you.