使用服务总线队列中的批量消息而不是为每条消息触发它的方法
Way to consume bulk messages from Service Bus Queue instead of triggering it for each message
我们有一个服务总线队列;我们正在考虑通过 Azure 函数中的服务总线队列触发器来处理消息。但是我们希望(在循环中)消费批量消息,而不是为每条消息重新触发 Function App。实现此目的的方法应该是什么以及使用哪个处理程序。应该仅使用 Azure Function,还是我们可以托管一个应用服务来使用它。
您可以使用 IAsyncCoollector
:
循环显示多条消息
for (var i = 0; i < 10; i++)
{
var message = new ServiceBusMessage($"Message #{i}");
await collector.AddAsync(serviceBusMessage);
}
这适用于 in-Process SDK。实现基于您在使用 Functions 发送多条消息时使用的 SDK。
请参阅此 blog 了解更多信息。
Official doc of Service Bus Binding host.json
到 Azure Functions 的批处理配置显示了发送和接收批处理消息所需的配置。
请参阅此 GitHub 问题 (Issue 921),其中包含 Azure Functions 服务总线绑定中出现的问题的少数解决方案。
你应该使用批处理。只需将变量声明为数组即可。
public static class ProcessOrders
{
[FunctionName("ProcessOrders")]
public static void Run(
[ServiceBusTrigger("orders", Connection = "ServiceBusConnection")]
Message[] orders, // <-- array
ILogger log)
{
log.LogInformation($"Number of orders: {orders.Length}");
}
}
您可以使用 host.json
文件进一步配置 batch size 等。
我们有一个服务总线队列;我们正在考虑通过 Azure 函数中的服务总线队列触发器来处理消息。但是我们希望(在循环中)消费批量消息,而不是为每条消息重新触发 Function App。实现此目的的方法应该是什么以及使用哪个处理程序。应该仅使用 Azure Function,还是我们可以托管一个应用服务来使用它。
您可以使用 IAsyncCoollector
:
for (var i = 0; i < 10; i++)
{
var message = new ServiceBusMessage($"Message #{i}");
await collector.AddAsync(serviceBusMessage);
}
这适用于 in-Process SDK。实现基于您在使用 Functions 发送多条消息时使用的 SDK。 请参阅此 blog 了解更多信息。
Official doc of Service Bus Binding host.json
到 Azure Functions 的批处理配置显示了发送和接收批处理消息所需的配置。
请参阅此 GitHub 问题 (Issue 921),其中包含 Azure Functions 服务总线绑定中出现的问题的少数解决方案。
你应该使用批处理。只需将变量声明为数组即可。
public static class ProcessOrders
{
[FunctionName("ProcessOrders")]
public static void Run(
[ServiceBusTrigger("orders", Connection = "ServiceBusConnection")]
Message[] orders, // <-- array
ILogger log)
{
log.LogInformation($"Number of orders: {orders.Length}");
}
}
您可以使用 host.json
文件进一步配置 batch size 等。