Skip to content

Custom Output binding for Azure Functions that forwards a message to multiple queues

Notifications You must be signed in to change notification settings

mizrael/AzureStorageTopics

Repository files navigation

Azure Storage Topics

Tests Nuget

This project aims to provide a very simple implementation of Topics over Azure Storage Queues, similar to Topics in Azure Service Bus.

Why?

Simply because being able to forward the same message (more or less) to multiple queues in one go is very convenient. Single queues are useful when dealing with Commands, which would expect to be pulled and processed by a single Consumer. Moreover, the Producer is aware and is expecting that there's a Consumer waiting on the other side. But when we need to broadcast an Event instead, the Producer doesn't know how many different Consumers there will be. Nor cares. The Producer's only goal is to inform the world that something happened.

How does it work?

The underlying idea is Messages can be sent to a virtual "topic", which in turn would forward it to the registered "subscriptions".

Simply add the Nuget package to your Azure Functions project, then add the Output binding:

[FunctionName(nameof(SendToTopic))]
public static async Task<IActionResult> SendToTopic(
    [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
    [StorageTopic("MyTopic")] IAsyncCollector<string> outputTopic)
{
    await outputTopic.AddAsync("hello world");

    return new OkObjectResult("wow");
}

Subscriptions can be configured directly in the host.json file:

{
  "extensions": {
    "storageTopics": {
      "topics": {
        "MyTopic": {
          "subscriptions": [
            {
              "name": "Subscription1"
            },
            {
              "name": "Subscription2"
            }
          ]
        }
      }
    }
  }
}

The library will automatically create the queues if not existing, using this naming convention: topic-subscription , lowercase:

Queues

The setting containing the connection string to the Storage Account can be specified by providing the ConnectionSettingName property to the StorageTopic attribute:

[FunctionName(nameof(SendToTopic))]
public static async Task<IActionResult> SendToTopic(
    [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
    [StorageTopic("MyTopic", ConnectionSettingName="AzureWebJobsStorage")] IAsyncCollector<string> outputTopic)

The default value is AzureWebJobsStorage.

TODO

  • more tests
  • support for Isolated mode

About

Custom Output binding for Azure Functions that forwards a message to multiple queues

Resources

Stars

Watchers

Forks

Languages