【问题标题】:Sequence processing with Azure Function & Service Bus使用 Azure 函数和服务总线进行序列处理
【发布时间】:2019-05-31 09:54:45
【问题描述】:

我遇到了 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);
    }

【问题讨论】:

标签: azure azure-servicebus-queues


【解决方案1】:

我通过在我的 host.json 中使用这个配置解决了我的问题

{
"version": "2.0",
"extensions": {
    "serviceBus": {
        "messageHandlerOptions": {
            "maxConcurrentCalls": 1
        }
    }
}}

【讨论】:

    【解决方案2】:

    有两种方法可以做到这一点,

    (1) 您正在寻找 Durable Functionfunction chaining

    对于后台作业,您通常需要确保只有一个 一次运行一个特定的协调器。这可以在 Durable 中完成 通过将特定实例 ID 分配给协调器来发挥作用 创建它。

    (2) 根据您写入Queue的消息,您需要partition数据,该数据将自动处理您不需要手动处理的消息顺序天蓝色函数

    【讨论】:

    【解决方案3】:

    一般来说,有序的消息传递不是我要努力实现的,因为顺序可能并且在某些时候会被扭曲。也就是说,在某些情况下,它是必需的。为此,您应该使用 Durable Function 来编排您的消息或使用 Service Bus message Sessions

    Azure Functions 最近添加了对有序消息传递的支持(强调传递部分,因为处理仍然可能失败)。它与普通的 Function 几乎相同,只是稍作改动,您需要指示 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 发送消息,这可能需要在发送方进行更改。

    【讨论】:

      猜你喜欢
      • 2022-01-27
      • 2015-01-03
      • 2017-11-01
      • 2020-07-20
      • 2012-05-04
      • 2021-03-10
      • 2019-03-06
      • 2023-02-14
      相关资源
      最近更新 更多