我对Azure函数的EventHubTrigger感到有些困惑。
我有一个IoT Hub,并且正在使用其eventhub兼容端点来触发Azure功能,该功能将处理并存储接收到的数据。
但是,如果我的函数失败(=抛出异常),则在该函数调用期间处理的消息(或多个消息)将丢失。我实际上希望Azure函数运行时再次处理消息。具体来说,我希望这种行为是因为EventHubTrigger在功能应用程序存储帐户中保留检查点,以便跟踪它必须继续在事件流中的位置。
documention of the EventHubTrigger甚至声明
如果所有功能执行成功且没有错误,则会将检查点添加到关联的存储帐户
但是,即使我故意在我的函数中抛出异常,检查点也会更新,并且不会再收到消息。
我对EventHubTriggers文档的理解是错误的,还是EventHubTriggers实现(或其文档)错误?
答案 0 :(得分:5)
这篇文档似乎确实令人困惑。我猜它们是指函数应用程序主机本身的错误,而不是代码的错误。函数执行内部的异常不会停止处理和检查点进度。
事实上,事件中心不是为单个消息重试而设计的。处理器分批工作,它可以将整个批处理标记为已处理(即在其后创建检查点),或者重试整个批处理(例如,如果进程崩溃)。
见this forum question and answer。
如果您仍需要重新处理来自Event Hub的失败事件(并且错误不会经常发生),您可以自己实施此类机制。例如。
请注意,这样做的缺点是您将失去事件中心提供的排序保证(因为队列消息的处理时间晚于其邻居)。
答案 1 :(得分:0)
快速修复。如果系统宕机了几个小时,则重试策略将无法正常工作。您可以调用Process.GetCurrentProcess()。Kill();在异常处理中。这将阻止检查点继续前进。我已经使用基于消耗的功能应用程序对此进行了测试。您不会在日志中看到任何内容,但是我添加了电子邮件以通知出现了问题,并避免了数据丢失,我已经杀死了该功能实例。 希望这可以帮助。 将在其上以及工作流程的其他部分上放置一个博客,以便在使用逻辑应用程序的停机系统连续失败的情况下停止功能。