I’m looking into an architecture for high scale web performance application (theoretical at this point) on Windows Azure and wanted to pick your brains about “Windows Azure Queues (not SB)” and how best to scale/create them.
I’m basically looking at MVC front-end (Web Role), Windows Azure Queues (async message decoupling), Worker Role and blackened SQL DB.
My understanding is that we receive a message on the Web Role and then pass it to a Queue, the Worker Role will poll the queues {do work… e.g SQL DB CRUD operation} and send back a completion message.
What is the best way to handle the Windows Azure queue creation for scale and also passing the messages back and forth via the Web Role and the Worker Role? Is it best to have one queue for sending work e.g. orders and then another queue for notification e.g. status message
I have seen a lot of posts say that you should create your queues outside of your application code, makes sense but how do you scale this with the current Queue limitation “scalability target for a single Windows Azure queue is “constrained” at 500 transactions/sec”?
The MSDN has some great resources about scaling via queues.
• Role instance scaling refers to adding and removing additional web or worker role instances to handle the point-in-time workload. This often includes changing the instance count in the service configuration. Increasing the instance count will cause Windows Azure runtime to start new instances whereas decreasing the instance count will in turn cause it to shut down running instances.
• Process (thread) scaling refers to maintaining sufficient capacity in terms of processing threads in a given role instance by tuning the number of threads up and down depending on the current workload.
In short I’m looking for answers to the below questions:
- Queue creation best practice?
- How does the Web Role (MVC App) keep track of messages i.e. does it poll a ‘notification’ queue once it has passed the message off, what the best way to handle the message correlation in the Web Role to send back to the client (web consumer)?
- Are the scaling options above the best approach or should I be looking at dynamic scaling of queues on the fly (if so how?, I think SB Queues might be better in this case) creation of new queues to circumvent the 500 transactions/sec limitation?
As stated my questions are more theoretical at this moment in time, I want to architect and future proof any solution going forward.
Thanks