Azure Task Scheduling Options
Posted
by charlie.mott
on Geeks with Blogs
See other posts from Geeks with Blogs
or by charlie.mott
Published on Tue, 09 Oct 2012 06:59:50 GMT
Indexed on
2012/10/10
3:38 UTC
Read the original article
Hit count: 386
Currently, the Azure PaaS does not offer a distributed\resilient task scheduling service. If you do want to host a task scheduling product\solution off-premise (and ideally use Azure), what are your options?
PaaS
Option 1: Worker Roles
Use a worker role to schedule and execute actions at specific time periods. There are a few frameworks available to assist with this:
- http://azuretoolkit.codeplex.com
- https://github.com/Lokad/lokad-cloud/wiki/TaskScheduler
- http://blog.smarx.com/posts/building-a-task-scheduler-in-windows-azure - This addresses a slightly different set of requirements. It’s a more dynamic approach for queuing up tasks, but not repeatable tasks (e.g. daily).
I found the Azure Toolkit option the most simple to implement.
Step 1 : Create a domain entity implementing IJob for each job to schedule. In this sample, I asynchronously call a WCF service method.
1: namespace Acme.WorkerRole.Jobs2: {3: using AzureToolkit;4: using ScheduledTasksService;5:6: public class UploadEmployeesJob : IJob7: {8: public void Run()9: {10: // Call Tasks Service11: var client = new ScheduledTasksServiceClient("BasicHttpBinding_IScheduledTasksService");12: client.UploadEmployees();13: client.Close();14: }15: }16: }
Step 2 : In the worker role run method, add the jobs to the toolkit engine.
1: namespace Acme.WorkerRole2: {3: using AzureToolkit.Engine;4: using Jobs;5:6: public class WorkerRole : WorkerRoleEntryPoint7: {8: public override void Run()9: {10: var engine = new CloudEngine();11:12: // Add Scheduled Jobs (using CronJob syntax - see http://www.adminschoice.com/crontab-quick-reference).13:14: // 1. Upload Employee job - 8.00 PM every weekday (Mon-Fri)15: engine.WithJobScheduler().ScheduleJob<UploadEmployeesJob>(c => { c.CronSchedule = "0 20 * * 1-5"; });16: // 2. Purge Data job - 10 AM every Saturday17: engine.WithJobScheduler().ScheduleJob<PurgeDataJob>(c => { c.CronSchedule = "0 10 * * 6"; });18: // 3. Process Exceptions job - Every 5 minutes19: engine.WithJobScheduler().ScheduleJob<ProcessExceptionsJob>(c => { c.CronSchedule = "*/5 * * * *"; });20:21: engine.Run();22: base.Run();23: }24: }25: }
Pros Cons Azure Toolkit option is simple to implement. For the AzureToolkit option, you are limited to a single worker role. Otherwise, the jobs will be executed multiple times, once for each worker role instance. Paying for a continuously running worker role, even if it just processes a single job once a week. If you only have a few scheduled tasks to run calling asynchronous services hosted in different web roles, an extra small worker role likely to be sufficient. However, for an extra small worker role this still costs $14.40/month (03/09/2012).
Option 2: Use Scheduled Task on Azure Web Role calling a console app
Setup a Windows Scheduled Task on the Azure Web Role. This calls a console application that calls the WCF service methods that run the task actions. This design is described here:
- http://www.ronaldwidha.net/2011/02/23/cron-job-on-azure-using-scheduled-task-on-a-web-role-to-replace-azure-worker-role-for-background-job/
- http://www.voiceoftech.com/swhitley/index.php/2011/07/windows-azure-task-scheduler/
- http://devlicio.us/blogs/vinull/archive/2011/10/23/moving-to-azure-worker-roles-for-nothing-and-tasks-for-free.aspx
Pros Cons Fairly easy to implement. Supportability - I RDC’ed onto the Azure server and stopped the scheduled task. I then rebooted the machine and the task was re-started. I also tried deleting the task and rebooting, the same thing occurred. The only way to permanently guarantee that a task is disabled is to do a fresh deployment. I think this is a major supportability concern. Saleability - multiple instances would trigger multiple tasks.
You can only have one instance for the scheduled task web role. The guidance implements setup of the scheduled task as part of a web role instance. But if you have more than one instance in a web role, the task will be triggered multiple times for each scheduled action (once per machine).
Workaround: If we wanted to use scheduled tasks for another client with a saleable WCF service, then we could include the console & tasks scripts in a separate web role (e.g. a empty WCF service with no real purpose to it).
SaaS
Option 3: Azure Marketplace
I thought that someone might be offering this type of service via the Azure marketplace. At the point of writing this blog post, I did not find anyone doing so.
Pros Cons Nobody currently offers this on the Azure Marketplace.
Option 4: Online Job Scheduling Service Provider
There are plenty of online providers that offer this type of service on a pay-as-you-go approach. Some of these are free for small usage. Many of these providers are listed here:
http://en.wikipedia.org/wiki/Webcron
Pros Cons No bespoke development for scheduler. Reliance on third party.
IaaS
Option 5: Setup Scheduling Software on Azure IaaS VM’s
One of job scheduling software offerings could be installed and configured on Azure VM’s. A list of software options is listed here:
http://en.wikipedia.org/wiki/List_of_job_scheduler_software
Pros Cons Enterprise distributed\resilient task scheduling service VM Setup and maintenance Software Licence Costs
Option 6: VM Gallery
A the time of writing this blog post, I did not spot a VM in the gallery that included pre-installation of any of the above software options.
Pros Cons No current VM template.
Summary
For my current project that had a small handful of tasks to schedule with a limited project budget I chose option 1 (a worker role using the Azure Toolkit to schedule tasks).
If I was building an enterprise scale solution for the future, options 4 and 5 are currently worthy of consideration.
Hopefully, Microsoft will include tasks scheduling in the future as part of their PaaS offerings.
© Geeks with Blogs or respective owner