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



我需要在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

相关内容

  • 没有找到相关文章

最新更新