我需要在Azure上处理传入消息。每个消息都将与一个特定的实体相关联——比如说,通过EntityId
属性——属于同一实体的消息必须按照彼此的顺序进行处理。同时,我希望保留Azure函数的无服务器方面;如果我有1000个实体的稳定消息流,我希望有1000个函数的并发执行。我还没有找到一个干净的方法来实现这一点。服务总线队列有会话,这是我的需求的最接近实现,但Azure函数不支持它们:https://github.com/Azure/azure-functions-host/issues/563.然而,Azure Logic应用程序似乎支持它们。我正在考虑创建一个Azure逻辑应用程序,该应用程序由使用会话的服务总线队列触发("使用服务总线会话按顺序关联交付"模板(,然后挂接到HTTP触发的Azure函数以处理消息。逻辑应用程序的唯一目的是防止同时处理属于同一实体/会话的多条消息。有人能提供一些关于这种方法是否有效的见解吗?它是否有任何警告?
看看Azure功能团队成员的这篇文章:使用Azure功能进行有序事件处理
它使用Azure功能和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:上找到整个解决方案
https://github.com/jeffhollan/functions-csharp-eventhub-ordered-processing