我需要在 Azure 上处理传入消息。每条消息都将与一个特定的实体相关联——例如,通过EntityId
属性 – 属于同一实体的消息必须按彼此的顺序进行处理。同时,我会保留 Azure Functions 的无服务器特性;如果我有 1,000 个实体的稳定消息流,我希望我的函数有 1,000 个并发执行。我还没有找到实现这一目标的干净方法。服务总线队列具有会话,这是最接近我的要求的实现,但 Azure Functions 不支持它们:https://github.com/Azure/azure-functions-host/issues/563 https://github.com/Azure/azure-functions-host/issues/563。但是,它们似乎在 Azure 逻辑应用程序中受支持。我正在考虑创建一个由使用会话的服务总线队列触发的 Azure 逻辑应用程序(“使用服务总线会话进行相关按序传递”模板),然后挂钩到 HTTP 触发的 Azure 函数来处理消息。逻辑应用的唯一目的是防止同时处理属于同一实体/会话的多个消息。有人可以提供一些关于这种方法是否有效以及是否有任何警告的见解吗?
看一下 Azure Function 团队成员之一写的这篇文章:使用 Azure Functions 进行顺序事件处理 https://medium.com/@jeffhollan/in-order-event-processing-with-azure-functions-bb661eb55428
It uses Azure 函数 https://learn.microsoft.com/en-us/azure/azure-functions/ and Azure 事件中心 https://learn.microsoft.com/en-us/azure/event-hubs/:
Azure 事件中心可以处理数十亿个事件,并且保证每个分区的一致性和排序 https://learn.microsoft.com/en-us/azure/event-hubs/event-hubs-availability-and-consistency#consistency.
对于您的场景,每条消息都与相同的相关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 https://github.com/jeffhollan/functions-csharp-eventhub-ordered-processing
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)