Настройка Azure Функциональная шина обслуживания Topi c и привязка выхода по подписке через C# - PullRequest
0 голосов
/ 15 февраля 2020

У меня есть простой триггер HTTP Azure Функция с несколькими привязками вывода служебной шины. Все привязки указывают на одну и ту же Topi c, но у них разные подписки. Если бы я должен был установить это приложение функции через функцию. json это довольно просто:

{
  "bindings": [
    {
      "authLevel": "function",
      "name": "req",
      "type": "httpTrigger",
      "direction": "in",
      "methods": [
        "get",
        "post"
      ]
    },
    {
      "name": "$return",
      "type": "http",
      "direction": "out"
    },
    {
      "type": "serviceBus",
      "connection": "SERVICEBUS",
      "name": "output",
      "topicName": "outtopic",
      "subscriptionName": "sub",
      "direction": "out"
    },
    {
      "type": "serviceBus",
      "connection": "SERVICEBUS",
      "name": "output",
      "topicName": "outtopic",
      "subscriptionName": "sub2",
      "direction": "out"
    }
  ],
  "disabled": false
}

Но я публикую sh мои функции через Visual Studio, и поэтому мои Azure функции доступны только для чтения в портал и функция. json автоматически генерируется VS при публикации. Проблема в том, что я не могу понять, как настроить несколько выходных привязок, указывающих на разные подписки. В настоящее время у меня есть что-то вроде этого:

[FunctionName("Function2")]
public static async Task<IActionResult> Run(
    [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
    [ServiceBus("outtopic", entityType:EntityType.Topic)] IAsyncCollector<string> output,
    [ServiceBus("outtopic", entityType: EntityType.Topic)] IAsyncCollector<string> output2,
    ILogger log)
{
    log.LogInformation("C# HTTP trigger function processed a request.");

    string requestBody = await new StreamReader(req.Body).ReadToEndAsync();

    await output.AddAsync(requestBody);

    return new OkObjectResult("OK");
}

Как вы можете видеть, output и output2 указывают на одну и ту же Topi c, но нет возможности указать подписку. На данный момент я довольно уверен, что это еще не было реализовано. Но я надеюсь, что есть обходной путь, может быть?

Ответы [ 2 ]

1 голос
/ 15 февраля 2020

Невозможно напрямую поместить сообщения в подписку Topi c, скорее каждое сообщение должно проходить через Topi c.

Чтобы убедиться, что сообщение получает только определенная подписка, вы нужно настроить правило подписки Topi c. Подробнее о правилах читайте в блоге здесь .

1 голос
/ 15 февраля 2020

Попробуйте, добавьте свойство Connection в определение, для этого примера - если под подпиской вы подразумеваете подписку azure:

public static void Run([BlobTrigger("inputvideo/{customername}/{date}/{filename}", Connection = "AzureWebJobsStorage")]Stream myBlob, 
                                string customername, 
                                string date, 
                                string filename,
                                [ServiceBus("detectobjectsqueue",EntityType.Queue, Connection="ServiceBusConnectionString")] IAsyncCollector<string> output,
                                ILogger log)

Обновление За ваш комментарий я понял, что под подпиской вы подразумеваете подписку на топи c. В этом случае идея topi c состоит в том, что все подписки получают сообщение. Таким образом, у вас есть один издатель, и тот, кто подпишется на topi c, получит сообщение. Если вы хотите убедиться, что указанный c подписчик получает сообщение, либо внедрите фильтрацию сообщений (например, по типу) на принимающей конечной точке, либо используйте выделенную очередь для каждого подписчика.

Кроме того, концептуально издатель не должен знать, кто является подписчиком, и подписчик не должен знать, кто является издателем. Если вы знаете, кто является подписчиком, почему бы не использовать вызов REST, например, для конечной точки получения?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...