Azure Function 事件中心触发器可靠性

标签 azure azure-functions azure-eventhub azure-iot-hub

我对 Azure 函数的 EventHubTrigger 有点困惑。

我有一个 IoT 中心,并使用其与 eventhub 兼容的终结点来触发一个 Azure 函数,该函数将处理和存储接收到的数据。

但是,如果我的函数失败(= 引发异常),则在该函数调用期间正在处理的消息将丢失。实际上,我希望 Azure 函数运行时稍后再次处理消息。具体来说,我期望出现这种行为,因为 EventHubTrigger 在 Function Apps 存储帐户中保留检查点,以便跟踪事件流中必须继续的位置。

documention of the EventHubTrigger甚至指出

If all function executions succeed without errors, checkpoints are added to the associated storage account

但是,即使我故意在函数中抛出异常,检查点也会更新,并且不会再次收到消息。

是我对EventHubTriggers文档的理解错误,还是EventHubTriggers实现(或其文档)错误?

最佳答案

这篇文档看起来确实令人困惑。我猜它们是指 Function App 主机本身的错误,而不是您的代码的错误。函数执行内部的异常不会停止处理和检查点进度。

事实上,事件中心并不是为单个消息重试而设计的。处理器分批工作,它可以将整个批处理标记为已处理(即在其后创建一个检查点),或者重试整个批处理(例如,如果进程崩溃)。

参见this forum question and answer

如果您仍然需要重新处理来自事件中心的失败事件(并且错误不会经常发生),您可以自己实现此类机制。例如。

  1. 将输出队列绑定(bind)添加到您的 Azure Functions。
  2. 在处理代码周围添加 try-catch。
  3. 如果抛出异常,请将有问题的事件添加到队列中。
  4. 使用另一个带有队列触发器的函数来处理这些事件。

请注意,这样做的缺点是您将失去事件中心提供的排序保证(因为队列消息将晚于其邻居消息进行处理)。

关于Azure Function 事件中心触发器可靠性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49166791/

相关文章:

postgresql - Azure Postgresql 数据库诊断设置中看不到事件中心命名空间

python - 使用 python 处理事件中心数据

azure - 使用 Azure AD 进行身份验证,手动 GET 请求成功,但使用 .net Framework 应用程序失败

python - Azure CosmosDB 为什么在插入 Azure CosmosDB 时不自动添加 'id' 字段?

azure-functions - 我可以在天蓝色函数中实现异步 "fire and forget"HTTP 触发器吗

visual-studio - 发布后似乎没有触发 Azure Function App

elasticsearch - azure evenhub 插件和 Filebeat azure 模块的区别

Azure Web 应用程序 : How to access specific instance directly via URL?

azure - 将 MFA 与 Azure AD B2C 结合使用

azure - 如何缩放 Kusto 时间表上的数据系列