Azure Functions with Azure Service Bus

Source
NuGet Package NServiceBus.AzureFunctions.ServiceBus (0.x) | License
This is a Preview project.
Target NServiceBus Version: 7.x

Host NServiceBus endpoints with Azure Functions and Azure Service Bus triggers.

Basic usage

Endpoint configuration

static readonly FunctionEndpoint endpoint = new FunctionEndpoint(executionContext =>
{
    var serviceBusTriggeredEndpointConfiguration = ServiceBusTriggeredEndpointConfiguration.FromAttributes();
    // customize configuration here
    return serviceBusTriggeredEndpointConfiguration;
});

The endpoint is automatically configured with the endpoint name and the transport connection string based on the values defined in the [ServiceBusTrigger] attribute using the ServiceBusTriggeredEndpointConfiguration.FromAttributes method.

Alternatively, the endpoint name can be passed in manually:

static readonly FunctionEndpoint endpoint = new FunctionEndpoint(executionContext =>
{
    var serviceBusTriggeredEndpointConfiguration = new ServiceBusTriggeredEndpointConfiguration("ASBTriggerQueue");

    return serviceBusTriggeredEndpointConfiguration;
});

Azure Function definition

Pass the incoming message to the NServiceBus endpoint:

[FunctionName("ASBTriggerQueue")]
public static async Task Run(
    [ServiceBusTrigger(queueName: "ASBTriggerQueue")]
    Message message,
    ILogger logger,
    ExecutionContext executionContext)
{
    await endpoint.Process(message, executionContext, logger);
}

NServiceBus interacts directly with the Azure Functions logging infrastructure by passing the ILogger instance from the function parameters to the endpoint's Process method.

Configuration

License

The license is provided via the NSERVICEBUS_LICENSE environment variable, which is set via the Function settings in the Azure Portal. For local development, use local.settings.json. In Azure, specify a Function setting using the environment variable as the key.

{
  "IsEncrypted": false,
  "Values": {
    ...
    "NSERVICEBUS_LICENSE": "<?xml version=\"1.0\" encoding=\"utf-8\"?><license id=\"1222e1d1-2222-4a46-b1c6-943c442ca710\" expiration=\"2113-11-30T00:00:00.0000000\" type=\"Standard\" LicenseType=\"Standard\" LicenseVersion=\"4.0\" MaxMessageThroughputPerSecond=\"Max\" WorkerThreads=\"Max\" AllowedNumberOfWorkerNodes=\"Max\">. . .</license>"
  }
}

Custom diagnostics

NServiceBus startup diagnostics are disabled by default when using Azure Functions. Diagnostics can be written to the logs via the following snippet:

serviceBusTriggeredEndpointConfiguration.LogDiagnostics();

Error queue

For recoverability to move the continuously failing messages to the error queue rather than to the Azure Service Bus dead-letter queue, the error queue must be created in advance and configured using the following API:

endpointConfiguration.AdvancedConfiguration.SendFailedMessagesTo("error");

Known constraints and limitations

When using Azure Functions with Azure Service Bus (ASB) the following points must be taken into consideration:

  • There is no support for the SendsAtomicWithReceive transport transaction mode.
  • The Configuration API exposes NServiceBus transport configuration options via the configuration.Transport method to allow customization; however, not all of the options will be applicable to execution within Azure Functions.

Preparing the Azure Service Bus namespace

Function endpoints cannot create their own queues or other infrastructure in the Azure Service Bus namespace.

Use the asb-transport command line (CLI) tool to provision the entities in the namespace for the Function endpoint.

Creating the endpoint queue

asb-transport endpoint create <queue name>

See the full documentation for the asb-transport endpoint create command for more details.

If the asb-tranport command-line tool is not used to create the queue, it is recommended to set the MaxDeliveryCount setting to the maximum value.

Subscribing to events

asb-transport endpoint subscribe <queue name> <eventtype>

See the full documentation for the asb-transport endpoint subscribe command for more details.

Samples


Last modified