使用逻辑应用程序在无服务器 Azure Functions 上按顺序处理消息

In-order message processing on serverless Azure Functions using Logic Apps

我需要在 Azure 上处理传入消息。每条消息都将与一个特定的实体相关联——比如,通过 EntityId 属性——并且属于同一实体的消息必须相对于彼此按顺序处理。同时,我会保留 Azure Functions 的无服务器方面;如果我有 1,000 个实体的稳定消息流,我希望我的函数有 1,000 个并发执行。我还没有找到一种干净的方法来实现这一目标。服务总线队列有会话,这是最接近我的要求的实现,但 Azure Functions 不支持它们:https://github.com/Azure/azure-functions-host/issues/563。但是,它们似乎在 Azure 逻辑应用程序中受支持。我正在考虑创建一个由服务总线队列使用会话("Correlated in-order delivery using service bus sessions" 模板)触发的 Azure 逻辑应用程序,然后挂钩到 HTTP 触发的 Azure 函数以处理消息。逻辑应用程序的唯一目的是防止同时处理属于同一 entity/session 的多条消息。有人可以就此方法是否有效以及是否有任何注意事项提供一些见解?

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

它使用Azure Functions and Azure Events Hubs:

Azure Events Hubs can handle billions of events, and 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