所以场景是我使用 SB 队列来限制对其他服务的传出回调。回调其他服务的标准问题之一是它们可能会在无法控制的时间内停机。假设我检测到目标已关闭/未响应,那么放弃该消息以使其不会立即重新出现在队列中的最佳模式是什么?
以下是我知道、尝试过或正在考虑的一些方法:
显然,如果我只是使用
BrokeredMessage::Abandon()
该消息将被解锁并放回队列中。对于这种情况以及我试图避免的情况,这显然是不可取的。如果我只是忽略了我遇到错误并且从不调用 Abandon 的事实,这将阻止它立即出现,但我并没有真正细粒度地控制它再次出现之前的时间,我想实现一个衰减重试策略。
我想也许我可以调用
BrokeredMessage::Abandon(IDictionary<string, object>)
并以某种方式更新ScheduledEnqueueTimeUTC
属性,但我已经尝试过了,除了最初发送消息之外,似乎没有办法影响该属性。有道理,但认为值得一试。我考虑过仅
BrokeredMessage::Complete()
在这种情况下使用,实际上只是将带有属性集的消息的新副本排入队列。ScheduledEqueueTimeUTC
最后的子弹似乎太重了,但我得出的结论是,鉴于队列的固有性质,这可能是正确的答案。我只是想在我缺少的 Azure SB 队列中可能有更好的方法来执行此操作。