Home

Awesome

Carbon Aware Computing Hangfire Extension

Overview

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.

Installation

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)
);

Usage

There are extension to Enqueue and Schedule with WithCarbonAwarenessAsync.

Fire and Forget tasks

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));    

Delayed tasks

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));

Recurring tasks

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.

Fallback

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))
        );

Extensibility

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.

Methodology

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

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.