使用Azure功能和服务总线进行序列处理

时间:2019-05-31 09:54:45

标签: azure azure-servicebus-queues

我与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);
    }

enter image description here

3 个答案:

答案 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
        }
    }
}}