Преимущества асинхронного ServiceBusTrigger - PullRequest
0 голосов
/ 07 мая 2019

Я работаю над микросервисами (использующими приложения-функции Azure), которые содержат функции Azure на основе ServiceBusTrigger, которые срабатывают при вставке сообщения в очередь служебной шины .

Iпытаюсь определить наилучший способ привязки выходных значений к нескольким целям (например, CosmosDB и IoT Hub).От того, будет ли метод помечен как асинхронный, будет зависеть, как мне следует решить эту проблему.

Насколько я знаю, вы обычно обрабатываете привязку вывода с помощью асинхронной функции с помощью * 1010.* аннотация;однако в моем случае использования мне нужно вернуть два разных значения двум отдельным целям (например, CosmosDb и IoT Hub).Я не думаю, что это то, чего я могу достичь с помощью привязки возвращаемого значения или привязки выходной переменной, поскольку у вас не может быть параметра out с асинхронным методом, и вы можете определить несколько возвращаемых значений с помощью подхода [return: ...].

Казалось бы, мой единственный вариант (если я пошел по асинхронному маршруту) - вручную вызывать методы SDK в функции Azure для вызова служб независимо от любых выходных значений.Я стараюсь не делать этого, поскольку предпочтительным подходом является привязка выходных данных.

При создании новой функции Azure на основе ServiceBusTrigger я заметил, что сгенерированная сигнатура метода не помечен как async по умолчанию.

Это отличается от HttpTrigger, который равен помечен как async вне коробки.

Может кто-нибудь помочь мне понять причину этого?Какие последствия масштабирования связаны с одним против другого?

В традиционном смысле я понимаю, почему вы обычно отмечаете HttpTrigger как асинхронный;однако я не понимаю причин, по которым ServiceBusTrigger не является асинхронным

Мне нужно понять этот бит, прежде чем я смогу перейти к укреплению своего подхода к выводам.

1 Ответ

1 голос
/ 07 мая 2019

Я не думаю, что шаблоны с / без async функциями имеют какое-либо обоснование для них как таковых.И в зависимости от вашего кода ваша функция может быть более эффективной.
Читать эту ветку для более подробной информации о async/await в функциях.

Что касается вашего основного вопроса, у вас просто естьдля привязки к различным объектам для выходных привязок CosmosDB и IoT Hub.

using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;

namespace CosmosDBSamplesV2
{
    public static class WriteDocsIAsyncCollector
    {
        [FunctionName("WriteDocsIAsyncCollector")]
        public static async Task Run(
            [QueueTrigger("todoqueueforwritemulti")] ToDoItem[] toDoItemsIn,
            [CosmosDB(
                databaseName: "ToDoItems",
                collectionName: "Items",
                ConnectionStringSetting = "CosmosDBConnection")]
                IAsyncCollector<ToDoItem> toDoItemsOut,
            ILogger log)
        {
            log.LogInformation($"C# Queue trigger function processed {toDoItemsIn?.Length} items");

            foreach (ToDoItem toDoItem in toDoItemsIn)
            {
                log.LogInformation($"Description={toDoItem.Description}");
                await toDoItemsOut.AddAsync(toDoItem);
            }
        }
    }
}
[FunctionName("EH2EH")]
public static async Task Run(
    [EventHubTrigger("source", Connection = "EventHubConnectionAppSetting")] EventData[] events,
    [EventHub("dest", Connection = "EventHubConnectionAppSetting")]IAsyncCollector<string> outputEvents,
    ILogger log)
{
    foreach (EventData eventData in events)
    {
        // do some processing:
        var myProcessedEvent = DoSomething(eventData);

        // then send the message
        await outputEvents.AddAsync(JsonConvert.SerializeObject(myProcessedEvent));
    }
}
...