清除没有序列号的 Azure 服务总线上的延迟消息
Cleaning up deferred messages on Azure Service Bus without the sequence number
如果我丢失了序列号,是否有任何方法可以恢复或删除 Azure 服务总线上的延迟消息?
场景是:我想用BrokeredMessage.Defer()
延迟一条消息。我打算记录序列号,并在以后使用它来检索消息。但是,如果出现问题 - 假设部署了一些有缺陷的代码 - 并且序列号没有正确记录,那么该消息似乎将以延迟状态位于服务总线上,直到消息过期为止,这可能是永远的。
这主要是因为该消息将在队列或订阅中占用 space,而且我还没有找到任何方法来恢复 space 除了完全删除 queue/subscription.
是否有任何方法来接收或删除"lost" 延迟消息?
至于防止由于丢失序列号而导致孤立的延迟消息,您应该在维护它们的存储过程中建立弹性,也许使用另一个队列。换句话说,当你延迟一条消息时,在另一个队列或主题中创建一条消息来存储延迟的序列号,或者整个消息(克隆)。
我通常将所有延迟邮件移至我自己的 "deferred topic",并单独处理它们。换句话说,我自己的自定义延迟逻辑,完全避免了这个问题。如果自动超时逻辑在您的场景中不起作用 (BrokeredMessage.TimeToLive),这可能是更适合您的方法。
本文很好地部分解释了您的场景,使用了 Queue.Receive 的特殊重载:
http://markheath.net/post/defer-processing-azure-service-bus-message
由于您正在存储序列号(以弹性方式:-)),另一种选择是存储整个消息(JSON、属性 包等),并且当你想再次处理它时重新提交它(也许从另一个队列)。
从队列或订阅中查看消息也将 return 延迟消息。
延迟消息的状态 = "Deferred".
通过这种方式,您可以获得延迟邮件的序列号,然后处理或删除这些邮件。
您可以在 ServiceBus Explorer 中尝试:
如果我丢失了序列号,是否有任何方法可以恢复或删除 Azure 服务总线上的延迟消息?
场景是:我想用BrokeredMessage.Defer()
延迟一条消息。我打算记录序列号,并在以后使用它来检索消息。但是,如果出现问题 - 假设部署了一些有缺陷的代码 - 并且序列号没有正确记录,那么该消息似乎将以延迟状态位于服务总线上,直到消息过期为止,这可能是永远的。
这主要是因为该消息将在队列或订阅中占用 space,而且我还没有找到任何方法来恢复 space 除了完全删除 queue/subscription.
是否有任何方法来接收或删除"lost" 延迟消息?
至于防止由于丢失序列号而导致孤立的延迟消息,您应该在维护它们的存储过程中建立弹性,也许使用另一个队列。换句话说,当你延迟一条消息时,在另一个队列或主题中创建一条消息来存储延迟的序列号,或者整个消息(克隆)。
我通常将所有延迟邮件移至我自己的 "deferred topic",并单独处理它们。换句话说,我自己的自定义延迟逻辑,完全避免了这个问题。如果自动超时逻辑在您的场景中不起作用 (BrokeredMessage.TimeToLive),这可能是更适合您的方法。
本文很好地部分解释了您的场景,使用了 Queue.Receive 的特殊重载:
http://markheath.net/post/defer-processing-azure-service-bus-message
由于您正在存储序列号(以弹性方式:-)),另一种选择是存储整个消息(JSON、属性 包等),并且当你想再次处理它时重新提交它(也许从另一个队列)。
从队列或订阅中查看消息也将 return 延迟消息。 延迟消息的状态 = "Deferred".
通过这种方式,您可以获得延迟邮件的序列号,然后处理或删除这些邮件。
您可以在 ServiceBus Explorer 中尝试: