我与Azure Function Service Bus触发器有问题。 问题是Azure功能无法等待消息完成后再处理新消息。它并行处理,不会等待5秒钟才收到下一条消息。但是我需要它处理顺序(如下图所示)。 我该怎么办?
[FunctionName("HttpStartSingle")]
public static void Run(
[ServiceBusTrigger("MyServiceBusQueue", Connection = "Connection")]string myQueueItem,
[OrchestrationClient] DurableOrchestrationClient starter,
ILogger log)
{
Console.WriteLine($"MessageId={myQueueItem}");
Thread.Sleep(5000);
}
答案 0 :(得分:0)
有两种方法可以完成此任务,
(1)您正在寻找 Durable Function
和 function chaining
对于后台作业,您通常需要确保仅一个实例 一个特定的协调器一次运行。这可以在耐用中完成 通过在以下情况下为协调器分配特定的实例ID来实现功能 创建它。
(2)根据要写入Queue的消息,您需要 partition 数据,这些数据将自动处理不需要处理的消息顺序。通过天蓝色功能手动
答案 1 :(得分:0)
通常,有序消息传递不是我要努力实现的事情,因为该命令可能并且在某些时候会失真。话说回来,在某些情况下,这是必需的。为此,您应该使用耐用功能来编排消息,或者使用服务总线message Sessions。
Azure Functions最近增加了对有序消息传递的支持(由于处理仍然可能失败,因此在传递部分上加了重音)。它与正常功能几乎相同,但需要稍作更改,以指示SDK使用会话。
public async Task Run(
[ServiceBusTrigger("queue",
Connection = "ServiceBusConnectionString",
IsSessionsEnabled = true)] Message message, // Enable Sessions
ILogger log)
{
log.LogInformation($"C# ServiceBus queue trigger function processed message: {Encoding.UTF8.GetString(message.MessageId)}");
await _cosmosDbClient.Save(...);
}
这里是post,表示更多细节。
警告:使用会话将要求发送带有会话ID的消息,这可能需要在发送端进行更改。
答案 2 :(得分:0)
我已经通过在host.json中使用此配置解决了问题
{
"version": "2.0",
"extensions": {
"serviceBus": {
"messageHandlerOptions": {
"maxConcurrentCalls": 1
}
}
}}