A 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.
Hangfire.Community.CarbonAwareExecution is available as a NuGet package. You can install it using the NuGet Package Console window:
Install-Package Hangfire.Community.CarbonAwareExecution
After installation add the extension to the Hangfire configuration. It extends the AddHangfire-Extension to add additional dependencies.
builder.Services.AddHangfireCarbonAwareExecution(configuration => configuration
.UseCarbonAwareDataProvider(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. A WattTime data provider is implemented as well.
Hangfire.Community.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).
To avoid unnecessary processing only a few grid regions are active. Currently de, fr, at, ch
-
Europe (without UK): The API from https://www.energy-charts.info/ are used. The data is the share of renewable energy to the total power production. The origin data source is from entso-e. The data is generated every day at 19:00+01 for the next day. After 19:00+01 the maximum forecast is next day 24:00+01.
-
United Kingdom: The API from https://carbonintensity.org.uk/ are used. The data is the carbon intensity. The data is generated periodically .
We will provide data for the european grid regions. Please send a mail to am@bluehands.de if you need for one of the inactive regions.
For forecasts outside of europe you may use the WattTime provider with an active account.