【问题标题】:How to delete/clear active/dead-letter messages from Azure Service Bus Queue?如何从 Azure 服务总线队列中删除/清除活动/死信消息?
【发布时间】:2020-01-08 23:02:29
【问题描述】:

是否无论如何要删除/清除 Azure 门户中 Azure 服务总线队列中的活动/死信消息?目前我们已经向我们的队列发送了几条消息,而活动消息和一些死信消息都在那里无所事事,而且我们的服务总线订阅者没有以某种方式触发,所以我们想删除这些消息以使我们的队列又干净了。为了等到服务总线在过期后丢弃这些消息,我们可以自己手动删除它们吗?

【问题讨论】:

    标签: azure azureservicebus azure-servicebus-queues


    【解决方案1】:

    是否有办法从 Azure 门户中的 Azure 服务总线队列中删除/清除活动/死信消息?

    目前不支持清除操作。有一个feature request可以实现purge,但是还没有实现。

    您可以使用一些工具来执行类似清除的操作。 ServiceBus Explorer 可以清除常规和死信队列上的消息(接收和删除选项)。

    或者,您也可以编写一个脚本来执行此操作。

    【讨论】:

    • 感谢您的回复!关于您最后一条评论“编写一个脚本来做”,您能否参考任何文档或教程/示例?
    • 我没有要分享的链接。当我写下这篇文章时,指的是 PowerShell 选项,您可以在其中使用 ASB SDK 来完成这项工作。
    【解决方案2】:

    使用服务总线资源管理器,您可以连接到 Azure 服务总线并管理消息传递实体。您可以下载工具here

    下载工具后,您将运行“ServiceBusExplorer.exe” 在 Service Bus Explorer 中,转到 File Connect

    输入您可以在中找到的连接字符串 仪表板 --> 服务总线 --> --> 共享访问策略

    连接成功后你将能够看到连接的服务总线中的所有主题队列选择你想要访问的队列

    您可以随意接收和删除

    【讨论】:

    • 感谢您的回复!是的,我们使用过服务总线资源管理器,但是这个工具可以手动发送/检查,我的问题是当我的队列中已经有消息并且我想看看它们是什么样子时,我不能在这里使用服务总线资源管理器...它能够告诉我与我有多少消息作为活动/死信一样,但不会向我详细显示它们的样子..
    • 对不起,我的错了,我现在找到了使用服务总线资源管理器检测和删除消息的方法!
    【解决方案3】:

    您可以为此调用服务总线 API。使用 DELETE 方法将从队列中检索和删除消息。官方文档是here。 API 是

    https://{SERVICENAMESPACE}.servicebus.windows.net/{QUEUE_NAME}/$DeadLetterQueue/messages/head

    。和

    https://{SERVICENAMESPACE}.servicebus.windows.net/{QUEUE_NAME}/messages/head

    您可以使用如下 curl 来接收和删除消息,编写一个 while 循环可以实现您的目标。 SAS token 可以按照官方文档获取。

    curl -X DELETE -H "Authorization: SharedAccessSignature sr=<NAMESPACE NAME>.servicebus.windows.net&sig=<SHARED ACCESS KEY>&se=<TOKEN EXPIRY INSTANT>&skn=<SHARED KEY NAME>" ${URL}
    

    获取 SAS 令牌代码:

        get_sas_token() {
        eval ${CONNECT_STRING}
        local EXPIRY=${EXPIRY:=$((60 * 60 * 1))} # Default token expiry is 1 hour
    local ENCODED_URI=$(echo -n ${Endpoint} | jq -s -R -r @uri)
        local TTL=$(($(date +%s) + ${EXPIRY}))
        local UTF8_SIGNATURE=$(printf "%s\n%s" ${ENCODED_URI} ${TTL} | iconv -t utf8)
    local HASH=$(echo -n "${UTF8_SIGNATURE}" | openssl sha256 -hmac ${SharedAccessKey} -binary | base64)
        local ENCODED_HASH=$(echo -n ${HASH} | jq -s -R -r @uri)
    AUTH_HEADER="SharedAccessSignature sr=${ENCODED_URI}&sig=${ENCODED_HASH}&se=${TTL}&skn=${SharedAccessKeyName}"
    }
    

    删除死信队列(您可以更改 URL 以删除活动消息):

    purge_dlq_queue() {
        local DLQ_QUEUE_URL="https://${SERVICENAMESPACE}.servicebus.windows.net/${QUEUE_NAME}/\$DeadLetterQueue/messages/head"
        local count=1000
        echo "cleaning the dead letters messages from the message queue..."
    while [[ ${count} -ge 0 ]]
        do
            local STATUS_CODE=$(curl -I -X DELETE -H "Authorization: ${AUTH_HEADER}" ${DLQ_QUEUE_URL} 2>/dev/null | head -n 1 | cut -d$' ' -f2)
            if [[ STATUS_CODE -ge 300 ]]; then
                echo "Exit dead letters message queue cleaning with code ${STATUS_CODE}"
                return 1
            elif [[ STATUS_CODE -eq 204 ]]; then
                echo "dead letters message queue has been cleaned"
                return 0
            fi
            let count--
        done
        echo "Exit with maxium number tries."
        return 1
    }
    

    脚本代码可以从here查看

    【讨论】:

      【解决方案4】:

      您可以使用基于 Windows 的商业工具 QueueExplorer 删除消息:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-09-07
        • 2017-08-13
        • 2017-02-13
        • 2013-12-21
        • 2017-01-16
        • 2017-06-07
        • 2022-01-13
        • 2020-07-19
        相关资源
        最近更新 更多