使用逻辑应用程序在无服务器 Azure Functions 上按顺序处理消息
In-order message processing on serverless Azure Functions using Logic Apps
我需要在 Azure 上处理传入消息。每条消息都将与一个特定的实体相关联——比如,通过 EntityId
属性——并且属于同一实体的消息必须相对于彼此按顺序处理。同时,我会保留 Azure Functions 的无服务器方面;如果我有 1,000 个实体的稳定消息流,我希望我的函数有 1,000 个并发执行。我还没有找到一种干净的方法来实现这一目标。服务总线队列有会话,这是最接近我的要求的实现,但 Azure Functions 不支持它们:https://github.com/Azure/azure-functions-host/issues/563。但是,它们似乎在 Azure 逻辑应用程序中受支持。我正在考虑创建一个由服务总线队列使用会话("Correlated in-order delivery using service bus sessions" 模板)触发的 Azure 逻辑应用程序,然后挂钩到 HTTP 触发的 Azure 函数以处理消息。逻辑应用程序的唯一目的是防止同时处理属于同一 entity/session 的多条消息。有人可以就此方法是否有效以及是否有任何注意事项提供一些见解?
查看 Azure 职能团队成员之一的这篇文章:
In order event processing with Azure Functions
它使用Azure Functions and Azure Events Hubs:
Azure Events Hubs can handle billions of events, and 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
我需要在 Azure 上处理传入消息。每条消息都将与一个特定的实体相关联——比如,通过 EntityId
属性——并且属于同一实体的消息必须相对于彼此按顺序处理。同时,我会保留 Azure Functions 的无服务器方面;如果我有 1,000 个实体的稳定消息流,我希望我的函数有 1,000 个并发执行。我还没有找到一种干净的方法来实现这一目标。服务总线队列有会话,这是最接近我的要求的实现,但 Azure Functions 不支持它们:https://github.com/Azure/azure-functions-host/issues/563。但是,它们似乎在 Azure 逻辑应用程序中受支持。我正在考虑创建一个由服务总线队列使用会话("Correlated in-order delivery using service bus sessions" 模板)触发的 Azure 逻辑应用程序,然后挂钩到 HTTP 触发的 Azure 函数以处理消息。逻辑应用程序的唯一目的是防止同时处理属于同一 entity/session 的多条消息。有人可以就此方法是否有效以及是否有任何注意事项提供一些见解?
查看 Azure 职能团队成员之一的这篇文章: In order event processing with Azure Functions
它使用Azure Functions and Azure Events Hubs:
Azure Events Hubs can handle billions of events, and 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