我需要在Azure上处理传入消息。每条消息都将与特定实体相关联(例如,通过EntityId
属性),并且属于同一实体的消息必须相对于彼此按顺序进行处理。同时,我将保留Azure Functions的无服务器方面。如果我有1000个实体的稳定消息流,则我希望函数有1000个并发执行。我还没有找到实现这一目标的干净方法。服务总线队列具有会话,这是我的要求的最接近的实现,但是Azure功能https://github.com/Azure/azure-functions-host/issues/563不支持它们。但是,它们似乎在Azure Logic应用中受支持。我正在考虑创建一个Azure逻辑应用程序,该应用程序由使用会话的服务总线队列触发(使用“使用服务总线会话进行相关的有序传递”模板),然后挂接到HTTP触发的Azure函数来处理消息。 Logic App的唯一目的是防止同时处理属于同一实体/会话的多个消息。有人可以提供一些关于这种方法是否行得通,以及是否有警告的见解吗?
答案 0 :(得分:1)
查看其中一位Azure Function团队成员的文章: In order event processing with Azure Functions
它使用Azure Functions和Azure Events Hubs:
Azure事件中心可以处理数十亿个事件,has guarantees around consistency and ordering per partition。
对于您的情况,与同一EntityId
相关的每条消息都必须转到相同的分区。
订单处理和让天蓝色功能独立扩展的诀窍是从事件中心提取批次并保留订单。
您的函数应如下所示:
[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