Azure功能事件中心触发可靠性

时间:2018-03-08 06:31:24

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

我对Azure函数的EventHubTrigger感到有些困惑。

我有一个IoT Hub,并且正在使用其eventhub兼容端点来触发Azure功能,该功能将处理并存储接收到的数据。

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

documention of the EventHubTrigger甚至声明

  

如果所有功能执行成功且没有错误,则会将检查点添加到关联的存储帐户

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

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

2 个答案:

答案 0 :(得分:5)

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

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

this forum question and answer

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

  1. 将输出队列绑定添加到Azure功能。
  2. 在处理代码周围添加try-catch。
  3. 如果抛出异常,请将有问题的事件添加到队列中。
  4. 使用另一个具有队列功能的触发器来处理这些事件。
  5. 请注意,这样做的缺点是您将失去事件中心提供的排序保证(因为队列消息的处理时间晚于其邻居)。

答案 1 :(得分:0)

快速修复。如果系统宕机了几个小时,则重试策略将无法正常工作。您可以调用Process.GetCurrentProcess()。Kill();在异常处理中。这将阻止检查点继续前进。我已经使用基于消耗的功能应用程序对此进行了测试。您不会在日志中看到任何内容,但是我添加了电子邮件以通知出现了问题,并避免了数据丢失,我已经杀死了该功能实例。 希望这可以帮助。 将在其上以及工作流程的其他部分上放置一个博客,以便在使用逻辑应用程序的停机系统连续失败的情况下停止功能。