⚠ Deprecated: Legacy
The package is renamed to be consistent with the Hangfire community extensions guidlines. Please move to Hangfire.Community.CarbonAwareExecution
Suggested alternative: Hangfire.Community.CarbonAwareExecution
A Hangfire Extension to schedule tasks on a point in time with minimal grid carbon intensity. The extension uses the Green Software Foundation Carbon Aware SDK to calculate best execution time. For the emission forecast open data is used.
$ dotnet add package CarbonAwareComputing.HangfireA Hangfire extension to schedule tasks with carbon awareness in mind. The best point in time is calculated based on emission forecasts to get a window with a minimal grid carbon intensity.
CarbonAwareComputing.Hangfire is available as a NuGet package. You can install it using the NuGet Package Console window:
Install-Package CarbonAwareComputing.Hangfire
After installation add the extension to the Hangfire configuration.
builder.Services.AddHangfireCarbonAwareExecution(configuration => configuration
.UseCarbonAwareExecution(new CarbonAwareDataProviderOpenData(), ComputingLocations.Germany)
);
There are extension to Enqueue and Schedule with WithCarbonAwarenessAsync.
Setup the latest execution time and the estimated task duration. The extension will do a best effort to get a window with the estimated task duration and minimal grid carbon intensity. When no window can be detected, the task is enqueued immediately.
//use the extension methods
IBackgroundJobClient client = GetBackgroundJobClient();
await client.EnqueueWithCarbonAwarenessAsync(
() => Console.WriteLine("Enqueue carbon aware jobs"),
DateTimeOffset.Now + TimeSpan.FromHours(2),
TimeSpan.FromMinutes(5));
//or use the static versions
await CarbonAwareBackgroundJob.EnqueueAsync(
() => Console.WriteLine("Enqueue carbon aware jobs"),
DateTimeOffset.Now + TimeSpan.FromHours(2),
TimeSpan.FromMinutes(5));
Setup the earliest and latest execution time and the estimated task duration. The extension will do a best effort to get a window with the estimated task duration and minimal grid carbon intensity. When no window can be detected, the task is scheduled as desired.
//use the extension methods
IBackgroundJobClient client = GetBackgroundJobClient();
await client.ScheduleWithCarbonAwarenessAsync(
() => Console.WriteLine("Schedule carbon aware jobs"),
DateTimeOffset.Now + TimeSpan.FromHours(2),
TimeSpan.FromMinutes(20),
TimeSpan.FromMinutes(30), TimeSpan.FromMinutes(5));
//or use the static versions
await CarbonAwareBackgroundJob.ScheduleAsync(
() => Console.WriteLine("Schedule carbon aware jobs"),
DateTimeOffset.Now + TimeSpan.FromHours(2),
TimeSpan.FromMinutes(20),
TimeSpan.FromMinutes(30), TimeSpan.FromMinutes(5));
Setup the maximum execution delay after planned schedule time and the estimated task duration. The extension will do a best effort to get a window with the estimated task duration and minimal grid carbon intensity. When no window can be detected, the task is scheduled as desired.
//use the extension methods
IRecurringJobManager manager = GetRecurringJobManager();
manager.AddOrUpdateCarbonAware(
"daily",
() => Console.WriteLine("Hello, world!"),
Cron.Daily,
TimeSpan.FromHours(2),
TimeSpan.FromMinutes(20));
//or use the static versions
CarbonAwareRecurringJob.AddOrUpdate(
"daily",
() => Console.WriteLine("Hello, world!"),
Cron.Daily, TimeSpan.FromHours(2),
TimeSpan.FromMinutes(20));
The Hangfire Carbon Aware Extension will prevent the execution of the current instance of the recurring job. It is calculation a execution window with minimal carbon impact and the schedule that task. In the dashboard you will see the notice that the job was executed and a newly planned task.
If your computing location is outside Europe or you need other forecasts the WattTime data provider may be useful. You need a valid WattTime account to use the data provider.
builder.Services.AddHangfireCarbonAwareExecution(configuration => configuration
.UseCarbonAwareExecution(
() => new CarbonAwareExecutionOptions(
new CarbonAwareDataProviderWattTime(userName, password),
ComputingLocations.Germany))
);
For custom forecasts or scenarios you don't want the build in provider add a own data provider. You may extend the abstract base class CarbonAwareDataProvider or use the CarbonAwareDataProviderWithCustomForecast.
Hangfire.CarbonAwareExecution Extension make use of the Carbon Aware SDK a Green Software Foundation Project. There are some extensions to the SDK to use cached offline data sources in our fork.
The emission forecast data are uploaded periodically to a Azure Blob Storage for a given grid region and are public (e.g. for Germany https://carbonawarecomputing.blob.core.windows.net/forecasts/de.json).
For every grid region a data provider is needed:
Other data sources and regions are added soon.