所以情况是,我使用的是SB队列掐死传出回调到其他服务。 一个与回调的其他服务标准的问题是,他们可能会下降不可控制大量的时间。 假设我发现目标是下降/不回应,什么是放弃该消息,使其不会在队列立即重新出现的最佳模式?
下面的一些方法,我要么意识到,试图或正在考虑:
显然,如果我只是用BrokeredMessage::Abandon()
的消息将被解锁,并放回到队列中。 这是这种情况下,什么我试图避免显然是不希望。
如果我不理会,我遇到了一个错误,并且永远不会调用放弃,这将阻止它立即显示出来的事实,但我真的没有过多久细粒度的控制,直到它再次显示了,我想实现一个腐烂的重试策略。
我想也许我可以打电话给BrokeredMessage::Abandon(IDictionary<string, object>)
并以某种方式更新ScheduledEnqueueTimeUTC
属性,但我已经尝试了这一点,似乎没有成为一个方式来影响性能超出了最初发送的信息。 有道理,但认为值得一试。
我曾考虑只用BrokeredMessage::Complete()
在这种情况下,实际上只是入队的消息与新副本 ScheduledEqueueTimeUTC
属性集。
最后的子弹几乎显得过于重手,但我来这或许给队列的内在本质的正确答案的结论。 我只是想出有可能是我失踪Azure的SB队列内做一个更好的方式。
如果你想要把一个消息走了一会儿,你必须记下的SequenceNumber(这可能是在会话状态的sessionful队列)的地方,你可以推迟()它。 延迟的邮件可使用特殊的过载,接收赋予的SequenceNumber被检索; 这也是唯一的办法比他们到期,所以小心又在其他他们得到。 此功能是专为工作流和状态机,使他们能够对付失序消息到来。
在上面的子弹#2:你能不能打电话时只需设置TTL时间跨度上的消息Receive(TimeSpan)
而不是默认的Receive()
然后,你可以简单地舍弃邮件(不调用Abandon()
当TTL到期的消息,应在队列中出现。 虽然这不会给你细粒度控制说“x秒后重新出现,”它确实给你预测的当消息没有再次出现。
注意:使用基于存储的队列,你可以更新隐形超时,这样就会给你一个消息再度出场细粒度的控制。
感觉有点哈克,但我想出了解决的办法是
try
{
...
}
catch (Exception ex)
{
await Task.Delay(30000);
throw;
}
这样,它会等待30秒,使其放弃了。 它将时代的配置量之后最终一纸空文。
我使用Azure的Webjobs接收。 虽然我使用Task.Delay
代替Thread.Sleep
它似乎并没有被释放线程同时等待处理从队列中的其他项目(默认情况下,Webjobs并行处理16)。
如果我是你,我会咨询很多一个企业集成模式是在互联网的解决方案上的网页。 基本上你想有一个重试它如果失败先后将消息发送到死信队列。 然后,这些信息我们可以重新排队在以后的日子。 这可以是手动的或根据需要自动进行。
请注意,虽然网页我已将你的骆驼有关,该网页上的描述,因此Java的一切都是适用的.NET和天蓝色。 这里是一个更.NET一个,如果你的兴趣http://www.eaipatterns.com/
因为它似乎是使用内置在Azure服务总线的功能最简单的解决方案,我宁愿最后一种方法。
流程是这样的:
var newMessage = new BrokeredMessage();
// Copy message body and properties from original message...
var scheduleTimeUtc = DateTimeOffset.UtcNow.Add(...);
await queueClient.ScheduleMessageAsync(newMessage, scheduleTimeUtc);
await originalMessage.CompleteAsync()
文章来源: What's the proper way to abandon an Azure SB Message so that it becomes visible again in the future in a way I can control?