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

Sch*_*der 5 azure azure-eventhub azure-iot-hub azure-functions

关于Azure函数的EventHubTrigger,我有点困惑.

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

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

EventHubTrigger文档甚至说明了这一点

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

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

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

Mik*_*kov 6

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

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

看到这个论坛的问题和答案.

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

  1. 将输出队列绑定添加到Azure功能.
  2. 在处理代码周围添加try-catch.
  3. 如果抛出异常,请将有问题的事件添加到Queue.
  4. 使用另一个具有队列触发功能来处理这些事件.

请注意,这样做的缺点是您将松开事件中心提供的排序保证(因为队列消息将比其邻居更晚处理).