I have a Worker Role that executes code (fetching data and storing it to Azure SQL) every X hours. The timing is implemented using a Thread.Sleep in the while(true) loop in the Run method.
In the Web Role I want to have the abillity to manualy start the code in Worker Role (manualy fecth and store data in my case). I found out that the whole Worker Role can be restarted using the Azure Management API but it seems like an overkill, especialy looking at all the work needed around certificates.
Is there a better way to restart Worker Role from Web Role or have the code in Worker Role run on demand from the Web Role?
Anything like posting an event to an Azure Queue, posting a blob to Azure Blobs, changing a record in Azure Tables or even making some change in SQL Azure will work – the web role will do the change and the worker role will wait for that change. Perhaps Azure Queues would be the cleanest way, although I’m not sure.
One very important thing you should watch for is that if you decide to use polling – like query a blob until it appears – you should insert a delay between the queries, otherwise this code:
will rush into the storage and you’ll encounter outrageous transaction fees. In case of SQL Azure you will not see any fees, but you’ll waste the service capacity for no good and this will slow down other operations you queue to SQL Azure.
This is how is should be done: