ExponentialBackoffRetry 如何与 ServiceBus Trigger for Azure 函数一起使用?
How does ExponentialBackoffRetry works with ServiceBus Trigger for Azure function?
我想在我的 Azure Function 中实现一个非常简单的行为:如果在处理过程中出现异常,我想将下一次重试推迟一段时间。据我所知,在服务总线中没有直接的可能性,例如(除非创建新消息),但服务总线触发器有可能 ExponentialBackoffRetry
.
我没有找到任何关于服务总线连接如何工作的文档。 IE。函数执行失败后消息会发生什么。
一种可能的方法是将消息保存在函数基础结构中,并在我认为的持续时间内不断更新锁。关于我想知道的一些更实际的问题:
- 我可以使用退避重试多长时间(例如,如果我想重试最多 7 天,这样行吗?)
- 主机 reset/restarted/scaled 时会发生什么,我是因为实现细节而失去了这个回退,还是它仍然以某种方式得到维护?
重试选项适用于服务总线 SDK 执行的单个服务操作,旨在让 SDK 解决短期瞬态问题,例如偶尔的网络中断。除了配置 SDK 客户端之外,Functions 基础结构不知道重试,只会看到 SDK 花费更长的时间来执行请求的 read/publish 操作。
Functions 基础结构将应用运行时强加的任何执行时间限制,或者可能决定采取措施防止无响应的服务操作。 (免责声明:我可以谈论服务总线 SDK,但对函数运行时没有深入了解)
服务总线扩展的重试不会应用到您的函数代码;如果您的代码中出现错误,您最终会遇到异常情况,并且根据配置和 trigger/binding 使用情况,您的消息将被放弃或锁定直到超时。
我不确定您的具体情况,但您似乎需要考虑 deferring the message to be read explicitly at a later time or re-enqueuing the message with a schedule 以便函数可以在将来的特定时间再次读取。
Using retry support on top of trigger resilience
The function app retry policy is independent of any retries or resiliency that the trigger provides. The function retry policy will only layer on top of a trigger resilient retry. For example, if using Azure Service Bus, by default queues have a message delivery count of 10. The default delivery count means after 10 attempted deliveries of a queue message, Service Bus will dead-letter the message. You can define a retry policy for a function that has a Service Bus trigger, but the retries will layer on top of the Service Bus delivery attempts.
For instance, if you used the default Service Bus delivery count of 10, and defined a function retry policy of 5. The message would first dequeue, incrementing the service bus delivery account to 1. If every execution failed, after five attempts to trigger the same message, that message would be marked as abandoned. Service Bus would immediately requeue the message, it would trigger the function and increment the delivery count to 2. Finally, after 50 eventual attempts (10 service bus deliveries * five function retries per delivery), the message would be abandoned and trigger a dead-letter on service bus.
对于指数重试,您可能需要将总退避时间 + 处理时间保持在小于函数可以保留消息的时间,否则锁将过期,即使成功处理也会导致异常和重试。
今天服务总线锁定消息的方式,Azure 服务总线之上的指数退避不是一个好主意。一旦持久终端成为可能(无限锁定时间 w/o 需要更新),这将更有意义。
我想在我的 Azure Function 中实现一个非常简单的行为:如果在处理过程中出现异常,我想将下一次重试推迟一段时间。据我所知,在服务总线中没有直接的可能性,例如(除非创建新消息),但服务总线触发器有可能 ExponentialBackoffRetry
.
我没有找到任何关于服务总线连接如何工作的文档。 IE。函数执行失败后消息会发生什么。
一种可能的方法是将消息保存在函数基础结构中,并在我认为的持续时间内不断更新锁。关于我想知道的一些更实际的问题:
- 我可以使用退避重试多长时间(例如,如果我想重试最多 7 天,这样行吗?)
- 主机 reset/restarted/scaled 时会发生什么,我是因为实现细节而失去了这个回退,还是它仍然以某种方式得到维护?
重试选项适用于服务总线 SDK 执行的单个服务操作,旨在让 SDK 解决短期瞬态问题,例如偶尔的网络中断。除了配置 SDK 客户端之外,Functions 基础结构不知道重试,只会看到 SDK 花费更长的时间来执行请求的 read/publish 操作。
Functions 基础结构将应用运行时强加的任何执行时间限制,或者可能决定采取措施防止无响应的服务操作。 (免责声明:我可以谈论服务总线 SDK,但对函数运行时没有深入了解)
服务总线扩展的重试不会应用到您的函数代码;如果您的代码中出现错误,您最终会遇到异常情况,并且根据配置和 trigger/binding 使用情况,您的消息将被放弃或锁定直到超时。
我不确定您的具体情况,但您似乎需要考虑 deferring the message to be read explicitly at a later time or re-enqueuing the message with a schedule 以便函数可以在将来的特定时间再次读取。
Using retry support on top of trigger resilience
The function app retry policy is independent of any retries or resiliency that the trigger provides. The function retry policy will only layer on top of a trigger resilient retry. For example, if using Azure Service Bus, by default queues have a message delivery count of 10. The default delivery count means after 10 attempted deliveries of a queue message, Service Bus will dead-letter the message. You can define a retry policy for a function that has a Service Bus trigger, but the retries will layer on top of the Service Bus delivery attempts.
For instance, if you used the default Service Bus delivery count of 10, and defined a function retry policy of 5. The message would first dequeue, incrementing the service bus delivery account to 1. If every execution failed, after five attempts to trigger the same message, that message would be marked as abandoned. Service Bus would immediately requeue the message, it would trigger the function and increment the delivery count to 2. Finally, after 50 eventual attempts (10 service bus deliveries * five function retries per delivery), the message would be abandoned and trigger a dead-letter on service bus.
对于指数重试,您可能需要将总退避时间 + 处理时间保持在小于函数可以保留消息的时间,否则锁将过期,即使成功处理也会导致异常和重试。
今天服务总线锁定消息的方式,Azure 服务总线之上的指数退避不是一个好主意。一旦持久终端成为可能(无限锁定时间 w/o 需要更新),这将更有意义。