我有一个azure功能,可以向服务总线发送大约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());
这里的问题是,它似乎在等待所有消息的处理而不是仅仅传递。将大量消息发送到服务总线,然后等待所有已传递(未处理)的正确方法是什么?
答案 0 :(得分:0)
看看Bindings可以为您做什么。特别是您的情况:Azure Service Bus bindings for Azure Functions。
更具体地说:使用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);
});
}