Azure 服务总线消息重新出现超时
azure service bus message reappear timeout
如果我配置了服务总线代理消息接收器。它因任何原因而失败。我呼吁
message.abandon();
但是这意味着消息将在 queue/subscription 中再次返回。
我可以配置一个超时时间,在此之后相同的消息在队列中可用以供处理。
例如:如果队列中只有一条消息。而且它失败了,那么每秒钟或每分钟继续处理它是不好的。如果我配置某些东西,可以确保 failed/abandoned 消息仅在 30 分钟后重新出现。那就有用了。
有什么建议吗?
放弃消息时,您无法提供 "cool off" 时间。该消息将立即可用。在 MaxDeliveryCount
次尝试用尽之前,它不会成为死信。一旦所有这些处理尝试都用完,消息将进入死信队列。
如果您需要推迟消息处理,有几种选择。
延迟消息
您可以使用 BrokeredMessage.DeferAsync()
延迟消息。该消息将返回队列以供将来处理,并且将返回 SequenceNumber
条消息。这种方法的警告是需要保留 SequenceNumber
以便稍后检索消息。如果您碰巧丢失了 SequenceNumber
,仍然可以浏览并检索延迟的消息。更多信息 here.
正在安排新的未来消息
另一种选择是克隆传入的失败消息,使用 BrokeredMessage.ScheduledEnqueueTimeUTC
将其安排在将来的某个时间并完成原始消息。使用此选项,我建议使用 send-via feature, also known as Transaction Processing, to leverage atomic operation of completing the incoming message and sending the outgoing one. This way the code will not produce "ghost" message if completion fails. More information here.
发送计划在未来发送的新消息
使用客户端而不是消息进行调度
另一种选择是使用客户端而不是 BrokeredMessage
使用 client.ScheduleMessageAsync(). It will return a
SequenceNumber` 来安排您需要坚持的时间,但是使用此 API 可以随时取消消息时间点w/o等待预定时间到达或接收消息。更多 information here.
如果我配置了服务总线代理消息接收器。它因任何原因而失败。我呼吁
message.abandon();
但是这意味着消息将在 queue/subscription 中再次返回。
我可以配置一个超时时间,在此之后相同的消息在队列中可用以供处理。
例如:如果队列中只有一条消息。而且它失败了,那么每秒钟或每分钟继续处理它是不好的。如果我配置某些东西,可以确保 failed/abandoned 消息仅在 30 分钟后重新出现。那就有用了。
有什么建议吗?
放弃消息时,您无法提供 "cool off" 时间。该消息将立即可用。在 MaxDeliveryCount
次尝试用尽之前,它不会成为死信。一旦所有这些处理尝试都用完,消息将进入死信队列。
如果您需要推迟消息处理,有几种选择。
延迟消息
您可以使用 BrokeredMessage.DeferAsync()
延迟消息。该消息将返回队列以供将来处理,并且将返回 SequenceNumber
条消息。这种方法的警告是需要保留 SequenceNumber
以便稍后检索消息。如果您碰巧丢失了 SequenceNumber
,仍然可以浏览并检索延迟的消息。更多信息 here.
正在安排新的未来消息
另一种选择是克隆传入的失败消息,使用 BrokeredMessage.ScheduledEnqueueTimeUTC
将其安排在将来的某个时间并完成原始消息。使用此选项,我建议使用 send-via feature, also known as Transaction Processing, to leverage atomic operation of completing the incoming message and sending the outgoing one. This way the code will not produce "ghost" message if completion fails. More information here.
使用客户端而不是消息进行调度
另一种选择是使用客户端而不是 BrokeredMessage
使用 client.ScheduleMessageAsync(). It will return a
SequenceNumber` 来安排您需要坚持的时间,但是使用此 API 可以随时取消消息时间点w/o等待预定时间到达或接收消息。更多 information here.