Azure Function Event Hub 触发器可靠性
Azure Function Event Hub Trigger reliability
我对 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。
如果您仍然需要 re-process 来自事件中心的失败事件(并且错误不会经常发生),您可以自己实现这种机制。例如。
- 将输出队列绑定添加到您的 Azure 函数。
- 在处理代码周围添加 try-catch。
- 如果抛出异常,将有问题的事件添加到队列中。
- 有另一个带有队列触发器的函数来处理这些事件。
请注意,这样做的缺点是您将失去事件中心提供的顺序保证(因为队列消息的处理时间将晚于其邻居)。
快速修复。如果系统停机几个小时,重试策略将不起作用。你可以调用 Process.GetCurrentProcess().Kill();在异常处理中。这将阻止检查站向前移动。我已经使用基于消费的功能应用程序对此进行了测试。您不会在日志中看到任何内容,但我添加了电子邮件以通知出现问题并避免数据丢失我已经终止了函数实例。
希望这可以帮助。
会在它和工作流的其他部分上写一个博客,以防使用逻辑应用程序在停机系统上持续出现故障时我会停止运行。
我对 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。
如果您仍然需要 re-process 来自事件中心的失败事件(并且错误不会经常发生),您可以自己实现这种机制。例如。
- 将输出队列绑定添加到您的 Azure 函数。
- 在处理代码周围添加 try-catch。
- 如果抛出异常,将有问题的事件添加到队列中。
- 有另一个带有队列触发器的函数来处理这些事件。
请注意,这样做的缺点是您将失去事件中心提供的顺序保证(因为队列消息的处理时间将晚于其邻居)。
快速修复。如果系统停机几个小时,重试策略将不起作用。你可以调用 Process.GetCurrentProcess().Kill();在异常处理中。这将阻止检查站向前移动。我已经使用基于消费的功能应用程序对此进行了测试。您不会在日志中看到任何内容,但我添加了电子邮件以通知出现问题并避免数据丢失我已经终止了函数实例。 希望这可以帮助。 会在它和工作流的其他部分上写一个博客,以防使用逻辑应用程序在停机系统上持续出现故障时我会停止运行。