A New Set of APIs for Amazon SQS Dead-Letter Queue Redrive

0
131
A New Set of APIs for Amazon SQS Dead-Letter Queue Redrive


Voiced by Polly

Today, we launch a brand new set of APIs for Amazon SQS. These new APIs can help you handle dead-letter queue (DLQ) redrive programmatically. You can now use the AWS SDKs or the AWS Command Line Interface (AWS CLI) to programmatically transfer messages from the DLQ to their unique queue, or to a customized queue vacation spot, to aim to course of them once more. A DLQ is a queue the place Amazon SQS mechanically strikes messages that aren’t accurately processed by your client software.

To absolutely respect how this new API may aid you, let’s have a fast look again at historical past.

Message queues are an integral a part of fashionable software architectures. They permit builders to decouple companies by permitting asynchronous and message-based communications between message producers and shoppers. In most programs, messages are persevered in shared storage (the queue) till the buyer processes them. Message queues permit builders to construct functions which might be resilient to momentary service failure. They assist prioritize message processing and scale their fleet of employee nodes that course of the messages. Message queues are additionally common in event-driven architectures.

Asynchronous message alternate isn’t new in software architectures. The idea of exchanging messages asynchronously between functions appeared within the Sixties and was first made common when IBM launched TCAM for OS/360 in 1972. The common adoption got here 20 years later with IBM MQ Series in 1993 (now IBM MQ) and when Sun Microsystems launched Java Messaging Service (JMS) in 1998, a typical API for Java functions to work together with message queues.

AWS launched Amazon SQS on July 12, 2006. Amazon SQS is a extremely scalable, dependable, and elastic queuing service that “just works.” As Werner wrote on the time: “We have chosen a concurrency model where the process working on a message automatically acquires a leased lock on that message; if the message is not deleted before the lease expires, it becomes available for processing again. Makes failure handling very simple.

On January 29, 2014, we launched dead-letter queues (DLQ). DLQs aid you keep away from a message that didn’t be processed from staying endlessly on high of the queue, probably stopping different messages within the queue from processing. With DLQs, every queue has an related property telling Amazon SQS what number of occasions a message could also be offered for processing (maxReceiveCount). Each message additionally has an related obtain counter (ReceiveCount). Each time a client software picks up a message for processing, the message obtain depend is incremented by 1. When ReceiveCount > maxReceiveCount, Amazon SQS strikes the message to your designated DLQ for human evaluation and debugging. You usually affiliate alarms with the DLQ to ship notifications when such occasions occur. Typical causes to maneuver a message to the DLQ are as a result of they’re incorrectly formatted, there are bugs within the client software, or it takes too lengthy to course of the message.

At AWS re:Invent 2021, AWS introduced dead-letter queue redrive on the Amazon SQS console. The redrive addresses the second a part of the failed message lifecycle. It permits you to reinject the message in its unique queue to aim processing it once more. After the buyer software is fastened and able to devour the failed messages, you may redrive the messages from the DLQ again within the supply queue or a personalized queue vacation spot. It simply requires a few clicks on the console.

Today, we’re including APIs permitting you to write down functions and scripts that deal with the redrive programmatically. There is not a must have a human clicking on the console. Using the API will increase the scalability of your processes and reduces the danger of human error.

Let’s See It in Action
To check out this new API, I open a terminal for a command-line solely demo. Before I get began, I make sure that I’ve the most recent model of the AWS CLI. On macOS I enter brew improve awscli.

I first create two queues. One is the dead-letter queue, and the opposite is my software queue:

# First, I create the dead-letter queue (discover the -dlq I select so as to add on the finish of the queue title)
➜ ~ aws sqs create-queue 
            --queue-name awsnewsblog-dlq                                            
{
    "QueueUrl": "https://sqs.us-east-2.amazonaws.com/012345678900/awsnewsblog-dlq"
}

# second, I retrieve the Arn of the queue I simply created
➜  ~ aws sqs get-queue-attributes 
             --queue-url https://sqs.us-east-2.amazonaws.com/012345678900/awsnewsblog-dlq 
             --attribute-names QueueArn
{
    "Attributes": {
        "QueueArn": "arn:aws:sqs:us-east-2:012345678900:awsnewsblog-dlq"
    }
}

# Third, I create the applying queue. I enter a redrive coverage: put up messages within the DLQ after three supply makes an attempt
➜  ~ aws sqs create-queue 
             --queue-name awsnewsblog 
             --attributes '{"RedriveCoverage": "{"uselessLetterGoalArn":"arn:aws:sqs:us-east-2:012345678900:awsnewsblog-dlq","maxReceiveCount":"3"}"}' 
{
    "QueueUrl": "https://sqs.us-east-2.amazonaws.com/012345678900/awsnewsblog"
}

Now that the 2 queues are prepared, I put up a message to the applying queue:

➜ ~ aws sqs send-message 
            --queue-url https://sqs.us-east-2.amazonaws.com/012345678900/awsnewsblog 
            --message-body "Hello World"
{
"MD5OfMessageBody": "b10a8db164e0754105b7a99be72e3fe5",
"MessageId": "fdc26778-ce9a-4782-9e33-ae73877cfcb2"
}

Next, I devour the message, however I don’t delete it from the queue. This simulates a crash within the message client software. Message shoppers are speculated to delete the message after profitable processing. I set the maxReceivedCount property to three after I entered the redrivePolicy. I due to this fact repeat this operation thrice to power Amazon SQS to maneuver the message to the dead-letter queue after three supply makes an attempt. The default visibility timeout is 30 seconds, so I’ve to attend 30 seconds or extra between the retries.

➜ ~ aws sqs receive-message 
            --queue-url https://sqs.us-east-2.amazonaws.com/012345678900/awsnewsblog
{
"Messages": [
{
"MessageId": "fdc26778-ce9a-4782-9e33-ae73877cfcb2",
"ReceiptHandle": "AQEBP8yOfgBlnjlkGXjyeLROiY7xg7cZ6Znq8Aoa0d3Ar4uvTLPrHZptNotNfKRK25xm+IU8ebD3kDwZ9lja6JYs/t1kBlwiNO6TBACN5srAb/WggQiAAkYl045Tx3CvsOypbJA3y8U+MyEOQRwIz6G85i7MnR8RgKTlhOzOZOVACXC4W8J9GADaQquFaS1wVeM9VDsOxds1hDZLL0j33PIAkIrG016LOQ4sAntH0DOlEKIWZjvZIQGdlRJS65PJu+I/Ka1UPHGiFt9f8m3SR+Y34/ttRWpQANlXQi5ByA47N8UfcpFXXB5L30cUmoDtKucPewsJNG2zRCteR0bQczMMAmOPujsKq70UGOT8X2gEv2LfhlY7+5n8z3yew8sdBjWhVSegrgj6Yzwoc4kXiMddMg==",
"MD5OfBody": "b10a8db164e0754105b7a99be72e3fe5",
"Body": "Hello World"
}
]
}

# wait 30 seconds,
# then repeat two occasions (for a complete of three receive-message API calls)

After three processing makes an attempt, the message isn’t within the queue anymore:

➜  ~ aws sqs receive-message 
             --queue-url  https://sqs.us-east-2.amazonaws.com/012345678900/awsnewsblog
{
    "Messages": []
}

The message has been moved to the dead-letter queue. I examine the DLQ to substantiate (discover the queue URL ending with -dlq):

➜  ~ aws sqs receive-message 
             --queue-url  https://sqs.us-east-2.amazonaws.com/012345678900/awsnewsblog-dlq
{
    "Messages": [
        {
            "MessageId": "fdc26778-ce9a-4782-9e33-ae73877cfcb2",
            "ReceiptHandle": "AQEBCLtBMoZYVMMq7fUGNHeCliqE3mFXnkuJ+nOXLK1++uoXWBG31nDejCpxElmiBZWfbcfGJrEdKj4P9HJdrQMYDbeSqB+u1ZlB7CYzQBiQps4SEG0biEoubwqjQbmDZlPrmkFsnYgLD98D1XYWk/Ik6Z2n/wxDo9ko9rbZ15izK5RFnbwveNy8dfc6ireqVB1EGbeGkHcweHGuoeKWXEab1ynZWhNqZsQgCR6pWRkgtn59lJcLv4cJ4UMewNzvt7tMHH69GvVjXdYDYvJJI2vj+6RHvcvSHWWhTNT+CuPEXguVNuNrSya8gho1fCnKpVwQre6HhMlLPjY4wvn/tXY7+5rmte9eXagCqLQXaENB2R7qWNVPiWRIJy8/cTf37NLYVzBom030DNJlH9EeceRhCQ==",
            "MD5OfBody": "b10a8db164e0754105b7a99be72e3fe5",
            "Body": "Hello World"
        }
    ]
}

Now that the setup is prepared, let’s programmatically redrive the message to its unique queue. Let’s assume I perceive why the buyer didn’t accurately course of the message and that I fastened the buyer software code. I take advantage of start-message-move-task on the DLQ to start out the asynchronous redrive. There is an elective attribute (MaxNumberOfMessagesPerSecond) to manage the rate of the redrive:

➜ ~ aws sqs start-message-move-task 
            --source-arn arn:aws:sqs:us-east-2:012345678900:awsnewsblog-dlq
{
    "TaskHandle": "eyJ0YXNrSWQiOiI4ZGJmNjBiMy00MmUwLTQzYTYtYjg4Zi1iMTZjYWRjY2FkNmEiLCJzb3VyY2VBcm4iOiJhcm46YXdzOnNxczp1cy1lYXN0LTI6NDg2NjUyMDY2NjkzOmF3c25ld3NibG9nLWRscSJ9"
}

I can checklist and examine standing the of the transfer duties I initiated with list-message-move-tasks or cancel a operating process by calling the cancel-message-move-task API:

➜ ~ aws sqs list-message-move-tasks 
            --source-arn arn:aws:sqs:us-east-2:012345678900:awsnewsblog-dlq
{
    "Results": [
        {
            "Status": "COMPLETED",
            "SourceArn": "arn:aws:sqs:us-east-2:012345678900:awsnewsblog-dlq",
            "ApproximateNumberOfMessagesMoved": 1,
            "ApproximateNumberOfMessagesToMove": 1,
            "StartedTimestamp": 1684135792239
        }
    ]
}

Now my software can devour the message once more from the applying queue:

➜  ~ aws sqs receive-message 
             --queue-url  https://sqs.us-east-2.amazonaws.com/012345678900/awsnewsblog                                   
{
    "Messages": [
        {
            "MessageId": "a7ae83ca-cde4-48bf-b822-3d4bc1f4dcae",
            "ReceiptHandle": "AQEB9a+Dm2nvb3VUn9+46j9UsDidU/W6qFwJtXtNWTyfoSDOKT7h73e6ctT9RVZysEw3qqzJOx1cxblTTOSrYwwwoBA2qoJMGsqsrsRGGYojBvf9X8hqi8B8MHn9rTm8diJ2wT2b7WC+TDrx3zIvUeiSEkP+EhqyYOvOs7Q9aETR+Uz02kQxZ/cUJWsN4MMSXBejwW+c5ivv5uQtpfUrfZuCWa9B9O67Kj/q52clriPHpcqCCfJwFBSZkGTXYwTpnjxD4QM7DPS+xVeVfTyM7DsKCAOtpvFBmX5m4UNKT6TROgCnGxTRglUSMWQp8ufVxXiaUyM1dwqxYekM9uX/RCb01gEyCZHas4jeNRV5nUJlhBkkqPlw3i6w9Uuc2y9nH0Df8nH3g7KTXo4lv5Bl3ayh9w==",
            "MD5OfBody": "b10a8db164e0754105b7a99be72e3fe5",
            "Body": "Hello World"
        }
    ]
}

Availability
DLQ redrive APIs can be found at this time in all industrial Regions the place Amazon SQS is offered.

Redriving the messages from the dead-letter queue to the supply queue or a customized vacation spot queue generates further API calls billed based mostly on current pricing (beginning at $0.40 per million API calls, after the primary million, which is free each month). Amazon SQS batches the messages whereas redriving them from one queue to a different. This makes shifting messages from one queue to a different a easy and low-cost possibility.

To be taught extra about DLQ and DLQ redrive, examine our documentation.

Remember that we reside in an asynchronous world—so ought to your functions. Get began at this time and write your first redrive software.

— seb



LEAVE A REPLY

Please enter your comment!
Please enter your name here