我需要在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功能团队成员之一看看这篇文章:In order event processing with Azure Functions
它使用Azure Functions和Azure 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