在博文ServiceBus 佇列中死信(DLQ - Dead Letter Queue)問題一文中,介紹了服務匯流排產生私信的原因及可以通過程式碼的方式來清楚私信佇列中的訊息,避免長期佔用空間(因為私信中的訊息不會自動清理)
當前,我們也可以從Azure門戶中檢視到當前DLQ的數量,所佔空間及進入DLQ的原因
問題描述
在使用Azure Service Bus過程中,隨著時間的累積,當死信中存積了大量的訊息時,如何快速的清理掉這些訊息呢?
解決辦法
使用Azure官方提供的工具 Service Bus Explorer。 連線到當前的Service Bus,通過選擇Receive and Delete操作來獲取並從Service Bus服務端中刪除訊息。
1) 下載Service Bus Explorer,解壓檔案後,雙擊ServiceBusExplorer.exe
2) 連線到Service Bus中並檢視死信訊息
3) Receive and Delete: 資料獲取訊息的數量,然後再Receive Mode中選擇Receive and Delete
附錄:另一種方式是通過程式碼來處理死信訊息
如需要通過程式的方式獲取死信佇列中的訊息,獲取訊息的方式和正常佇列一樣,把queueName變為死信佇列的路徑,通過QueueClient.FormatDeadLetterPath(queueName)方式獲取
附上.NET虛擬碼:
static string queueName = "<QUEUE NAME>/$deadletterqueue"; static async Task ReceiveMessagesAsync() { await using (ServiceBusClient client = new ServiceBusClient(connectionString)) { // create a processor that we can use to process the messages ServiceBusProcessor processor = client.CreateProcessor(queueName, new ServiceBusProcessorOptions()); // add handler to process messages processor.ProcessMessageAsync += MessageHandler; // add handler to process any errors processor.ProcessErrorAsync += ErrorHandler; // start processing await processor.StartProcessingAsync(); Console.WriteLine("Wait for a minute and then press any key to end the processing"); Console.ReadKey(); // stop processing Console.WriteLine("\nStopping the receiver..."); await processor.StopProcessingAsync(); Console.WriteLine("Stopped receiving messages"); } }
參考資料
從佇列接收訊息: https://docs.azure.cn/zh-cn/service-bus-messaging/service-bus-dotnet-get-started-with-queues#receive-messages-from-a-queue
Azure Service Bus 死信佇列產生的原因: https://www.cnblogs.com/lulight/p/13652828.html
Azure Service Bus Explorer: https://github.com/paolosalvatori/ServiceBusExplorer/releases