Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Azure 将所有消息从死信队列移回订阅的主队列_Azure_Message Queue_Azureservicebus - Fatal编程技术网

Azure 将所有消息从死信队列移回订阅的主队列

Azure 将所有消息从死信队列移回订阅的主队列,azure,message-queue,azureservicebus,Azure,Message Queue,Azureservicebus,我的服务使用来自Azure服务总线订阅的消息。我的服务的一个依赖项关闭了一段时间,这导致许多消息最终进入死信队列(DLQ)。既然服务已经备份,我想重新处理来自DLQ的所有消息。如何将DLQ中的所有消息移回/重新提交到主队列中 限制: 它包含数千条消息,因此手动处理它们是不可行的 该主题大约有十个订阅。我不想将消息重新提交到主题,因为这样所有订阅都会收到消息,导致双重处理 我不想直接针对DLQ运行服务,因为有些消息被破坏并导致永久性错误,即它们将再次出现在DLQ中,这将导致无限循环。此外,断开的

我的服务使用来自Azure服务总线订阅的消息。我的服务的一个依赖项关闭了一段时间,这导致许多消息最终进入死信队列(DLQ)。既然服务已经备份,我想重新处理来自DLQ的所有消息。如何将DLQ中的所有消息移回/重新提交到主队列中

限制:

  • 它包含数千条消息,因此手动处理它们是不可行的
  • 该主题大约有十个订阅。我不想将消息重新提交到主题,因为这样所有订阅都会收到消息,导致双重处理
  • 我不想直接针对DLQ运行服务,因为有些消息被破坏并导致永久性错误,即它们将再次出现在DLQ中,这将导致无限循环。此外,断开的消息被放回队列的最前面,有效地饥饿了在断开消息之后出现的健康消息

重播DLQ消息的唯一选项是从DLQ接收消息,创建具有相同内容的新消息,然后再次发送到主题。它们将结束在订阅队列的末尾

您不能直接向订阅发送消息。有一个技巧可以将元数据属性添加到消息中,然后调整除一个订阅之外的所有订阅以过滤掉此类消息。这取决于你决定它是否对你的场景有帮助


至于工具,我们总是使用自定义代码来完成,因为我们总是需要做一些额外的工作,比如记录每个重放的消息以进行进一步分析。

Thomas,您可能已经找到了答案,因为这是很久以前的事了。将DLQ(或您现有的任何队列)看作是另一个集合变量,就像在PC应用程序中一样,但驻留在云端。就像PC应用程序或工具箱中的内存收集变量一样,您可以通过多种方式利用它。当然,这两种类型的集合变量之间存在局限性和差异,但这就是您设计解决方案的方式,因为通过了解这些局限性和差异,DLQ只是另一个集合变量

对于某些队列实现,解决方案之一是让同一应用的另一个实例指向DLQ,但具有相当长的可视性超时(例如6或12小时,甚至24小时,取决于您的SLA),因为您不想太频繁地重复它们。但是,这不适用于Azure service bus,因为它将可见性超时限制为最多5分钟


如果DLQ包含损坏的不可恢复作业,则应修复应用程序,以便在发生未知异常时根据错误消息删除这些作业。一旦部署了修复程序,您的应用程序就会删除这些已断开且无法恢复的作业,并且从一开始就不会将其发送到DLQ。而那些已经在DLQ中的消息将被固定应用程序删除。

快速回答是,您不能直接将消息移回订阅的主队列。这是微软如何实现他们的主题和订阅的设计

选项#1
可以选择使用Azure Service Bus主题筛选器,并以只允许在目标订阅上接收消息的方式定义/标记消息

选项#2

另一个选择是更改当前的实现。您将设置“传递队列”(常规服务总线队列),并配置每个相应的订阅以将其消息自动转发到这些传递队列。然后,您的消息处理逻辑将侦听这些“传递队列”和订阅。任何失败都会导致这些关联的“传递队列”上的DLQ消息,这些消息可以在主题/订阅之外处理。

我意识到这是在最初的帖子之后的一段时间,但是如果其他人偶然发现这个问题,有一个相当方便的解决方案会被放入(我发现这对于ASB开发非常方便)

连接到服务总线并找到所需的命名空间后,找到所需的
主题
订阅
,其中包含死信。从那里
右键单击
接收死信队列消息
,然后单击OK


从那里,突出显示您想要发送回主队列的消息,并点击“以批处理模式重新提交选定消息”按钮,是否有一个很好的理由说明每个设计不能将消息移回主队列?我希望该用例相当常见。@这是一个很好的问题,但我从来没有看到任何官方的动机。我我猜这只是“故意的”。我的假设是,您不希望无限期地重试邮件。如果您尝试调用不可用的服务,您希望在重试之前等待此服务再次可用。因此,如果您需要更多重试,您可以增加
最大传递计数
,或者实施断路器?实际上,当服务重新运行时ng,我想手动按下一个按钮,将所有邮件从DLQ移回主队列。手动执行此操作可防止无限次重试。增加
max delivery count
将不起作用,因为如果服务长时间关闭,邮件仍会在DLQ中结束。