Introduction

Azure Service Bus dead letter queues (DLQ) store messages that failed processing after exceeding max delivery attempts or TTL expiration. When DLQ fills up, new failed messages cannot be dead-lettered, causing system-wide message processing issues.

Symptoms

DLQ size exceeded:

json
{
  "error": {
    "code": "QuotaExceeded",
    "message": "The dead letter queue for queue 'my-queue' has reached its maximum size limit"
  }
}

Message cannot be dead-lettered:

```bash $ az servicebus queue show \ --name my-queue \ --namespace-name my-namespace \ --resource-group my-rg \ --query '{DLQ:countDetails.deadLetterMessageCount,Capacity:maxSizeInMegabytes}'

{ "DLQ": 50000, "Capacity": 1024 # Queue at limit } ```

Processing blocked:

```bash # Messages stuck in active queue az servicebus queue show \ --name my-queue \ --namespace-name my-namespace \ --resource-group my-rg \ --query 'countDetails.activeMessageCount'

# Returns high count due to DLQ full ```

Common Causes

  1. 1.Processing errors not resolved - Messages repeatedly fail and dead-letter
  2. 2.Max delivery count too low - Messages dead-letter before proper retry
  3. 3.Message TTL expired - Time-to-live exceeded before processing
  4. 4.Consumer offline - No receiver to process messages
  5. 5.Subscription filter mismatch - Messages don't match any subscription
  6. 6.Queue size limit too small - Insufficient capacity for DLQ
  7. 7.Error in dead-letter logic - Application incorrectly dead-lettering

Step-by-Step Fix

  1. 1.Check logs for specific error messages
  2. 2.Verify configuration settings
  3. 3.Test network connectivity
  4. 4.Review recent changes
  5. 5.Apply corrective action
  6. 6.Verify the fix

Step 1: Check DLQ Message Count

```bash # Check DLQ size az servicebus queue show \ --name my-queue \ --namespace-name my-namespace \ --resource-group my-rg \ --query 'countDetails.{Active:activeMessageCount,DLQ:deadLetterMessageCount,Scheduled:scheduledMessageCount}'

# For subscription DLQ az servicebus topic subscription show \ --topic-name my-topic \ --name my-subscription \ --namespace-name my-namespace \ --resource-group my-rg \ --query 'countDetails.deadLetterMessageCount' ```

Step 2: Drain Dead Letter Queue

```bash # Use Service Bus Explorer or PowerShell to drain DLQ # Via PowerShell (requires Azure PowerShell module): $queue = Get-AzServiceBusQueue -ResourceGroupName my-rg -NamespaceName my-namespace -QueueName my-queue $dlqPath = "$queue.Path/$queue.Name/$dlq"

# Receive all DLQ messages $messages = Receive-AzServiceBusMessage -QueuePath $dlqPath -ReceiveMode PeekLock

# Process or remove messages foreach ($msg in $messages) { # Option 1: Resubmit to main queue Send-AzServiceBusMessage -QueuePath $queue.Path -MessageBody $msg.Body

# Option 2: Complete (remove) the message Complete-AzServiceBusMessage -QueuePath $dlqPath -LockToken $msg.LockToken }

# Via Service Bus CLI (limited support): az servicebus message receive \ --queue-name my-queue/$deadletterqueue \ --namespace-name my-namespace \ --resource-group my-rg ```

Step 3: Analyze Dead-Letter Reasons

```bash # Dead-letter reasons are in message properties # Check via Service Bus Explorer or application logs

# Common reasons: # - MaxDeliveryCountExceeded # - TTLExpiredException # - SessionLockLostException # - MessageLockLostException

Step 4: Fix Processing Errors

# Common processing errors: # 1. Validation errors - Fix message format or validation logic # 2. Database errors - Check database connectivity # 3. Timeout errors - Increase operation timeout # 4. Dependency errors - Check downstream service status

# Update consumer error handling: # - Add proper exception handling # - Implement retry with exponential backoff # - Log specific error for debugging ```

Step 5: Adjust Max Delivery Count

```bash # Check current max delivery count az servicebus queue show \ --name my-queue \ --namespace-name my-namespace \ --resource-group my-rg \ --query 'maxDeliveryCount'

# Increase for transient errors (default is 10) az servicebus queue update \ --name my-queue \ --namespace-name my-namespace \ --resource-group my-rg \ --max-delivery-count 20

# For subscription az servicebus topic subscription update \ --topic-name my-topic \ --name my-subscription \ --namespace-name my-namespace \ --resource-group my-rg \ --max-delivery-count 20 ```

Step 6: Adjust Message TTL

```bash # Check TTL settings az servicebus queue show \ --name my-queue \ --namespace-name my-namespace \ --resource-group my-rg \ --query 'defaultMessageTimeToLive'

# Increase TTL for slow processing scenarios az servicebus queue update \ --name my-queue \ --namespace-name my-namespace \ --resource-group my-rg \ --default-message-time-to-live PT24H # 24 hours

# Enable TTL on DLQ messages az servicebus queue update \ --name my-queue \ --namespace-name my-namespace \ --resource-group my-rg \ --enable-dead-lettering-on-message-expiration true ```

Step 7: Increase Queue Size

```bash # Check current queue size az servicebus queue show \ --name my-queue \ --namespace-name my-namespace \ --resource-group my-rg \ --query '{Size:maxSizeInMegabytes,Capacity:capacity}'

# Increase queue capacity az servicebus queue update \ --name my-queue \ --namespace-name my-namespace \ --resource-group my-rg \ --max-size 5120 # 5GB max for Standard tier

# For Premium tier, auto-scaling handles capacity az servicebus namespace update \ --name my-namespace \ --resource-group my-rg \ --capacity 2 # Messaging units ```

Step 8: Set Up DLQ Monitoring

```bash # Create alert for DLQ threshold az monitor metrics alert create \ --name sb-dlq-high \ --resource-group my-rg \ --scopes /subscriptions/SUB/resourceGroups/my-rg/providers/Microsoft.ServiceBus/namespaces/my-namespace \ --condition "avg DeadletteredMessages > 1000" \ --window-size 5m

# Monitor queue metrics az monitor metrics list \ --resource /subscriptions/SUB/resourceGroups/my-rg/providers/Microsoft.ServiceBus/namespaces/my-namespace \ --metric "DeadletteredMessages" \ --query 'value[].timeseries[].data[].average' ```

Step 9: Implement DLQ Processing

```bash # Create dedicated DLQ processor # Application code pattern: # 1. Schedule periodic DLQ scan # 2. Peek messages to understand errors # 3. Fix and resubmit valid messages # 4. Archive invalid messages to storage

# Azure Function for DLQ processing: az functionapp create \ --name dlq-processor \ --resource-group my-rg \ --storage-account mystorage \ --consumption-plan-location eastus

# Configure Service Bus trigger for DLQ path # Queue path: "my-queue/$deadletterqueue" ```

Step 10: Review Subscription Filters

```bash # For topic/subscription scenarios # Check if messages match subscription filters az servicebus topic subscription rule list \ --topic-name my-topic \ --subscription-name my-subscription \ --namespace-name my-namespace \ --resource-group my-rg \ --query '[].{Name:name,Filter:filter}'

# Messages that don't match any rule go to DLQ # Add catch-all rule if needed az servicebus topic subscription rule create \ --topic-name my-topic \ --subscription-name my-subscription \ --namespace-name my-namespace \ --resource-group my-rg \ --name catch-all \ --filter-expression "1=1" # Match all messages ```

Dead Letter Queue Limits

TierMax Queue SizeDLQ Included
Basic1 GB - 5 GBSeparate storage
Standard1 GB - 5 GBShared with queue
PremiumAuto-scaledDedicated capacity

Verification

```bash # After draining DLQ and fixing processing az servicebus queue show \ --name my-queue \ --namespace-name my-namespace \ --resource-group my-rg \ --query 'countDetails.{Active:activeMessageCount,DLQ:deadLetterMessageCount}'

# Should show: # Active: normal count # DLQ: 0 or minimal count

# Monitor for 24 hours az monitor metrics list \ --resource /subscriptions/SUB/resourceGroups/my-rg/providers/Microsoft.ServiceBus/namespaces/my-namespace \ --metric "DeadletteredMessages" \ --start-time "2024-01-15T00:00:00Z" \ --end-time "2024-01-15T23:59:59Z" ```

Prevention

To prevent Azure Service Bus dead letter queue full issues from recurring, implement these proactive measures:

1. Monitor DLQ Size

yaml
groups:
- name: azure-servicebus-dlq
  rules:
  - alert: AzureServiceBusDLQFull
    expr: |
      azure_servicebus_dead_letter_message_count > 1000
    for: 10m
    labels:
      severity: warning
    annotations:
      summary: "Azure Service Bus dead letter queue exceeds 1000 messages"

2. Implement DLQ Processing

```csharp // Scheduled DLQ processor public class DLQProcessor { private readonly ServiceBusReceiver _dlqReceiver;

public async Task ProcessDLQ(string queueName) { var dlqPath = EntityNameFormatter.FormatDeadLetterPath(queueName);

await foreach (var message in _dlqReceiver.ReceiveMessagesAsync()) { try { // Log dead letter reason var reason = message.ApplicationProperties["DeadLetterReason"]; var description = message.ApplicationProperties["DeadLetterErrorDescription"];

_logger.LogWarning( "Processing DLQ message. Reason: {Reason}, Description: {Description}", reason, description);

// Analyze and fix or escalate await HandleDeadLetter(message);

// Complete after handling await _dlqReceiver.CompleteMessageAsync(message); } catch (Exception ex) { _logger.LogError(ex, "Failed to process DLQ message"); } } } } ```

3. Set Up DLQ Alerts and Automation

```bash # Create DLQ monitoring automation az logicapp workflow create \ --name dlq-monitor \ --resource-group my-rg \ --definition @dlq-monitor.json

# Schedule to run every hour # Checks DLQ size and alerts if > threshold ```

Best Practices Checklist

  • [ ] Monitor DLQ size
  • [ ] Implement DLQ processing
  • [ ] Set up DLQ alerts
  • [ ] Analyze dead letter reasons
  • [ ] Fix root causes proactively
  • [ ] Document DLQ handling procedures
  • [Fix Azure Service Bus Message Deferral](/articles/fix-azure-service-bus-message-deferral)
  • [Fix Azure Service Bus Session State Lost](/articles/fix-azure-service-bus-session-state-lost)
  • [Fix Azure Service Bus Throttling](/articles/fix-azure-cosmos-db-throttling)
  • [Technical troubleshooting: Fix Azure Aks Pod Crashloopbackoff Issue in Azure](azure-aks-pod-crashloopbackoff)
  • [Technical troubleshooting: Fix Azure Api Management Policy Expression Runtime](azure-api-management-policy-expression-runtime-error)
  • [Technical troubleshooting: Fix Azure App Configuration Feature Flag Not Refre](azure-app-configuration-feature-flag-not-refreshing)
  • [Technical troubleshooting: Fix Azure App Service 503 Always On Disabled Issue](azure-app-service-503-always-on-disabled)
  • [Technical troubleshooting: Fix Azure Application Gateway Err SSL Unrecognized](azure-application-gateway-err-ssl-unrecognized-name-alert)

<script type="application/ld+json"> { "@context": "https://schema.org", "@type": "TechArticle", "headline": "Fix Azure Service Bus Dead Letter Queue Full", "description": "Troubleshoot Service Bus dead letter queue overflow. Clear messages, fix processing errors, and adjust TTL settings.", "url": "https://www.fixwikihub.com/fix-azure-service-bus-dead-letter-queue-full", "publisher": { "@type": "Organization", "name": "FixWikiHub", "url": "https://www.fixwikihub.com" }, "author": { "@type": "Person", "name": "FixWikiHub Editorial Team" }, "datePublished": "2026-04-03T06:43:57.055Z", "dateModified": "2026-04-03T06:43:57.055Z" } </script>