繁体   English   中英

有没有办法可以延迟Azure功能中对服务总线消息的重试?

[英]Is there a way I can delay the retry for a service bus message in an Azure function?

我有一个函数可以从订阅中提取消息,并将其转发到HTTP端点。 如果端点不可用,则会引发异常。 发生这种情况时,我想将该特定消息的下一次尝试延迟一定的时间,例如15分钟。 到目前为止,我已经找到以下解决方案:

  • 捕获异常,睡觉,然后抛出。 这是一个糟糕的解决方案,因为我需要为处于睡眠状态的CPU使用率付费,这会影响该函数的吞吐量。
  • 捕获异常,克隆消息,设置ScheduledEnqueueTimeUtc属性,然后将其添加回队列。 这是一种更好的方法,但是它会重置传递计数,因此,只有一个订阅者无法处理实际问题时,绝不会解决任何实际问题,并将其重新发送给所有订阅。
  • 捕获异常,然后将消息放置在存储队列中。 这意味着维护一个存储队列以匹配每个预订,并具有两个功能而不是一个功能。

我理想地希望发生的是捕获异常,并在不释放消息锁定的情况下退出函数。 这样,一旦锁过期,该消息将再次重试。 但是,似乎在成功完成之后,该函数在消息上调用Complete() ,并在引发异常之后,在消息上调用Abandon() 是否可以绕过此延迟,或以其他方式实现延迟?

我将通过提供您提出的流程由LogicApp更好地处理纯函数来解决您的情况。

在LogicApp中实现“ 等待/重试/出队”下一模式非常容易,因为这种流控制正是LogicApp所设计的。

尽管仍处于预览状态(不建议用于生产代码),但可以使用Durable Functions 如果您想保持在代码中操作对象的能力,那可能是最好的选择!

(也为LogicApp解决方案+1!)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM