使用Logic Apps在无服务器Azure功能上进行有序消息处理

问题描述 投票:2回答:1

我需要在Azure上处理传入的消息。每条消息将与特定实体相关联 - 例如,通过EntityId属性 - 并且属于同一实体的消息必须相对于彼此按顺序处理。同时,我将保留Azure功能的无服务器方面;如果我有1000个实体的稳定消息流,我希望我的函数有1,000个并发执行。我还没有找到一种实现这一目标的简洁方法。 Service Bus队列具有会话,这是最接近我的要求的实现,但Azure Functions中不支持它们:https://github.com/Azure/azure-functions-host/issues/563。但是,Azure Logic Apps似乎支持它们。我正在考虑使用会话(“使用服务总线会话的相关按顺序交付”模板)创建由服务总线队列触发的Azure逻辑应用程序,然后挂钩到HTTP触发的Azure功能以处理消息。 Logic App的唯一目的是防止同时处理属于同一实体/会话的多个消息。有人可以提供一些有关这种方法是否有效的见解,以及是否有任何警告?

azure azure-functions azure-logic-apps azure-servicebus-queues
1个回答
1
投票

从Azure功能团队成员之一看看这篇文章:In order event processing with Azure Functions

它使用Azure FunctionsAzure Events Hubs

Azure Events Hubs可以处理数十亿个事件和has guarantees around consistency and ordering per partition

对于您的方案,与相同EntityId相关的每条消息都必须转到同一分区。

使订单处理和让azure函数独立扩展的技巧是从事件中心拉取批次,并保留顺序。

你的功能应该是这样的:

[FunctionName("EventHubTrigger")]
public static async Task RunAsync([EventHubTrigger("ordered", Connection = "EventHub")] EventData[] eventDataSet, TraceWriter log)
{
    log.Info($"Triggered batch of size {eventDataSet.Length}");
    foreach (var eventData in eventDataSet)
    {
        try
        {
            // Process message in order here.
        }
        catch
        {
            // handle event exception
        }
    }
}

我建议你阅读整篇文章,这非常有启发性

您可以在Github上找到整个解决方案:

https://github.com/jeffhollan/functions-csharp-eventhub-ordered-processing

© www.soinside.com 2019 - 2024. All rights reserved.