首页 > 解决方案 > 加快发送消息

问题描述

我有一个天蓝色的功能,可以向服务总线发送大约 20k 条消息。首先,我开始进行等待操作,但意识到这太慢了。之后我尝试了没有等待,这加快了速度。但是,我不能在发送所有消息之前从我的 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());

这里的问题是它似乎在等待所有消息被处理而不是仅仅被传递。将大量消息发送到服务总线并等待所有传递(未处理)的正确方法是什么?

标签: azureservicebusazure-servicebus-queues

解决方案


看看 Bindings 可以为您做什么。特别是在您的情况下:Azure Functions 的 Azure Service Bus 绑定
更具体地说:使用ICollector<T>or IAsyncCollector<T>is there 来创建多条消息。调用 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);
    });
}

推荐阅读