Ускорить отправку сообщений - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть функция Azure, которая отправляет около 20 тыс. Сообщений на служебную шину.Сначала я начал с операции ожидания, но понял, что это очень медленно.После я попытался без ожидания, и это ускорило его.Однако я не могу просто вернуться из своей функции azyre до того, как все сообщения будут отправлены, так как это завершит процесс.Затем я попытался сделать следующее:

     string queuePath = "xx";
     var queueClient = new QueueClient(_serviceBusConnectionString, queuePath);

     foreach(var tenantSite in tenatSites)
     {
        var jsonStr = JsonConvert.SerializeObject(tenantSite);

        string messageBody = jsonStr;
        var message = new Microsoft.Azure.ServiceBus.Message(Encoding.UTF8.GetBytes(messageBody));
        var task = queueClient.SendAsync(message);
        tasks.Add(task);
     }
     Task.WaitAll(tasks.ToArray());

Проблема здесь в том, что кажется, что все сообщения обрабатываются, а не просто доставляются.Каков правильный подход для отправки большого количества сообщений на служебную шину и ожидания всех доставленных (не обработанных)?

1 Ответ

0 голосов
/ 28 февраля 2019

Посмотрите, что Bindings может сделать для вас.А в вашем случае, в частности: привязки служебной шины Azure для функций Azure .
И, если быть более точным, для создания нескольких сообщений можно использовать ICollector<T> или IAsyncCollector<T>.При вызове метода Add создается сообщение.

Пример реализации будет выглядеть примерно так:

[FunctionName("FunctionName")]
public static void Run(
    [HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = "some-route")] HttpRequest req,
    [ServiceBus("some-queue-name", Connection = "ServiceBusConnectionSend", EntityType = EntityType.Queue)] ICollector<string> queueCollector,
    string name, ILogger log)
{
    Parallel.ForEach(tenantSites, (tenantSite) =>
    {
        var jsonStr = JsonConvert.SerializeObject(tenantSite);

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