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

使用逻辑应用程序在无服务器Azure函数上按顺序处理消息,azure,azure-functions,azure-logic-apps,azure-servicebus-queues,Azure,Azure Functions,Azure Logic Apps,Azure Servicebus Queues,我需要在Azure上处理传入消息。每个消息都将与特定实体相关联——比如,通过EntityId属性——属于同一实体的消息必须按顺序相互处理。同时,我希望保留Azure功能的无服务器方面;如果我有1000个实体的稳定消息流,我希望有1000个函数的并发执行。我还没有找到一个干净的方法来实现这一点。服务总线队列具有会话,这些会话是最接近我的需求的实现,但Azure函数不支持它们:。然而,Azure Logic应用程序似乎支持它们。我正在考虑创建一个Azure逻辑应用程序,该应用程序由使用会话的服务总线

我需要在Azure上处理传入消息。每个消息都将与特定实体相关联——比如,通过
EntityId
属性——属于同一实体的消息必须按顺序相互处理。同时,我希望保留Azure功能的无服务器方面;如果我有1000个实体的稳定消息流,我希望有1000个函数的并发执行。我还没有找到一个干净的方法来实现这一点。服务总线队列具有会话,这些会话是最接近我的需求的实现,但Azure函数不支持它们:。然而,Azure Logic应用程序似乎支持它们。我正在考虑创建一个Azure逻辑应用程序,该应用程序由使用会话的服务总线队列触发(“使用服务总线会话关联订单交付”模板),然后连接到HTTP触发的Azure函数以处理消息。Logic应用程序的唯一目的是防止同时处理属于同一实体/会话的多条消息。有人能提供一些关于这种方法是否有效的见解,以及它是否有任何警告吗?

请查看Azure功能团队成员之一的这篇文章:

它使用和:

Azure事件中心可以处理数十亿个事件,并且

对于您的场景,与同一
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上找到整个解决方案:


您可以尝试通过实体(entityid)来“驱动”工作流,并在队列中创建相应的消息(作业),每个实体对应一个消息(作业)。该作业然后收集所有需要的消息(从存储它们的任何地方收集)(通过entityid将它们放在分区中的最佳方式),然后按顺序处理它们。您可以同时驱动您的工作流。持久功能将是一个候选人。感谢分享这个!我看过那篇文章,但我认为它不能解决我的场景,因为事件集线器最多只支持32个分区()。这将并行度限制为32,而我希望能够扩展到100或1000个实体。不用担心:-),但是为什么要扩展到每个实体的一个实例?你还有其他顾虑吗?不确定,但使用logic app,您也会达到极限,因为您每5分钟只能执行300000个操作,而且可能会变得非常昂贵。我关心的是性能。每个实体都有稳定的消息流,我希望尽快处理这些消息。我不希望一个实体的消息排在属于碰巧位于同一分区上的其他实体的其他消息后面。感谢您让我了解Logic应用程序的限制;这就是我现在想收集的信息。你是对的;不仅有300000个操作限制,还有50个触发器并发限制,这使得逻辑应用程序几乎和事件中心一样糟糕,因为缺乏可伸缩性。你不应该太担心性能。在这篇文章中,他们在几秒钟内处理了100000条消息。您还需要将信息发送回用户吗?