AWS SDK SQS Examples: Messages Send, Receive, Delete आणि DLQs (Python, PHP, Node.js)
SQS म्हणजे app चा काम बनवणारा भाग आणि काम करणारा भाग यांच्यामधली queue. Standard आणि FIFO queue बनवू, Python, PHP आणि Node.js मधून messages send, receive, delete करू, आणि dead-letter queue जोडू. Example: Lyon मधली Chloé आणि पुण्याचा Rohan यांच्या bakery chain चे order tickets.
या chapter मध्ये तुम्ही काय शिकाल
- Standard व FIFO queues बनवा
- Single व batch messages send
- Long-poll, process, delete
- Visibility timeout समजा
- Dead-letter queue जोडा
1. मोठं चित्र: bakery मधला order spike
हे का लागतं?
Counter वर cashier प्रत्येक order slip वर लिहून rail ला लावतो. Bakers मोकळे झाले की slip घेतात. Baker ने slip टाकली तर थोड्या वेळाने ती परत rail वर येते. ती rail म्हणजे SQS: cashier ला oven ची वाट पाहावी लागत नाही.
हे काय आहे?
Receive केलेला message visibility timeout साठी लपतो. त्याआधी ReceiptHandle ने delete केला नाही तर तो परत दिसतो. maxReceiveCount प्रयत्नांनंतर तो DLQ मध्ये जातो.
कसं करायचं (step by step)
2. Queues बनवा
हे का लागतं?
Chloé ला सर्व orders साठी एक queue हवी, आणि Rohan ला FIFO queue हवी म्हणजे एका customer चे payments क्रमाने होतील.
हे काय आहे?
CreateQueue QueueUrl देतो जो पुढच्या सर्व calls ला लागतो. FIFO नाव .fifo ने संपायला हवं.
कसं करायचं (step by step)
- Python (boto3): long polling सह standard queue.
import boto3
sqs = boto3.client("sqs", region_name="eu-west-3")
url = sqs.create_queue(QueueName="bakery-orders",
Attributes={"ReceiveMessageWaitTimeSeconds": "20", "VisibilityTimeout": "60"})["QueueUrl"]
print(url)
अपेक्षित output:
https://sqs.eu-west-3.amazonaws.com/123456789012/bakery-orders
- Node.js (v3): FIFO queue.
import { SQSClient, CreateQueueCommand } from "@aws-sdk/client-sqs";
const sqs = new SQSClient({ region: "ap-south-1" });
const { QueueUrl } = await sqs.send(new CreateQueueCommand({
QueueName: "payments.fifo",
Attributes: { FifoQueue: "true", ContentBasedDeduplication: "true" },
}));
console.log(QueueUrl);
अपेक्षित output:
https://sqs.ap-south-1.amazonaws.com/123456789012/payments.fifo
- PHP (v3): नावावरून queue URL.
<?php
require "vendor/autoload.php";
$sqs = new Aws\Sqs\SqsClient(["region" => "eu-west-3"]);
$url = $sqs->getQueueUrl(["QueueName" => "bakery-orders"])["QueueUrl"];
echo $url, PHP_EOL;
अपेक्षित output:
https://sqs.eu-west-3.amazonaws.com/123456789012/bakery-orders
- Verify: prefix ने queues list.
aws sqs list-queues --queue-name-prefix bakery --region eu-west-3 --query "QueueUrls" --output text
अपेक्षित output:
https://sqs.eu-west-3.amazonaws.com/123456789012/bakery-orders
3. Messages send करा
हे का लागतं?
Lyon ची प्रत्येक croissant order आणि पुण्याची प्रत्येक ₹450 ची cake order एक message बनते.
हे काय आहे?
Body 256 KB पर्यंत text; JSON पाठवा. SendMessageBatch एकावेळी 10 पर्यंत. FIFO ला MessageGroupId लागतो.
कसं करायचं (step by step)
- Python: attribute सह एक order.
import json
r = sqs.send_message(QueueUrl=url,
MessageBody=json.dumps({"order": "LY-101", "item": "croissant", "qty": 12, "total": "€18.00"}),
MessageAttributes={"shop": {"DataType": "String", "StringValue": "lyon"}})
print(r["MessageId"])
अपेक्षित output:
5fea7756-0ea4-451a-a703-a558b933e274
- Node.js: एका customer चं FIFO payment.
import { SendMessageCommand } from "@aws-sdk/client-sqs";
const r = await sqs.send(new SendMessageCommand({
QueueUrl, MessageGroupId: "cust-rohan",
MessageBody: JSON.stringify({ order: "PN-77", amount: "₹450" }),
}));
console.log(r.MessageId, r.SequenceNumber);
अपेक्षित output:
b1c2d3e4-... 18872039482910000000
- PHP: तीन orders batch send.
<?php
$entries = [];
foreach (["LY-102", "LY-103", "LY-104"] as $i => $id) {
$entries[] = ["Id" => "m$i", "MessageBody" => json_encode(["order" => $id])];
}
$r = $sqs->sendMessageBatch(["QueueUrl" => $url, "Entries" => $entries]);
echo count($r["Successful"]), " sent, ", count($r["Failed"] ?? []), " failed", PHP_EOL;
अपेक्षित output:
3 sent, 0 failed
- Verify: वाट पाहणाऱ्या messages ची संख्या.
aws sqs get-queue-attributes --queue-url $URL --attribute-names ApproximateNumberOfMessages --query Attributes.ApproximateNumberOfMessages --output text
अपेक्षित output:
4
4. Receive, process आणि delete
हे का लागतं?
Lyon मधलं baker app 10 पर्यंत slips घेईल, bake करेल, आणि फक्त पूर्ण झालेल्या काढेल.
हे काय आहे?
WaitTimeSeconds=20 सह ReceiveMessage = long polling: कमी रिकामे calls, कमी खर्च. ह्या receive च्या ReceiptHandle ने delete करा.
कसं करायचं (step by step)
- Python: worker loop.
while True:
msgs = sqs.receive_message(QueueUrl=url, MaxNumberOfMessages=10,
WaitTimeSeconds=20, MessageAttributeNames=["All"]).get("Messages", [])
if not msgs: break
for m in msgs:
body = json.loads(m["Body"])
print("baking", body["order"])
sqs.delete_message(QueueUrl=url, ReceiptHandle=m["ReceiptHandle"])
अपेक्षित output:
baking LY-101
baking LY-102
baking LY-103
baking LY-104
- Node.js: receive आणि batch delete.
import { ReceiveMessageCommand, DeleteMessageBatchCommand } from "@aws-sdk/client-sqs";
const { Messages = [] } = await sqs.send(new ReceiveMessageCommand({ QueueUrl, MaxNumberOfMessages: 10, WaitTimeSeconds: 20 }));
for (const m of Messages) console.log("paid", JSON.parse(m.Body).order);
if (Messages.length) await sqs.send(new DeleteMessageBatchCommand({ QueueUrl,
Entries: Messages.map((m, i) => ({ Id: String(i), ReceiptHandle: m.ReceiptHandle })) }));
अपेक्षित output:
paid PN-77
- PHP: हळू कामासाठी visibility timeout वाढवा.
<?php
$r = $sqs->receiveMessage(["QueueUrl" => $url, "WaitTimeSeconds" => 20]);
foreach ($r["Messages"] ?? [] as $m) {
$sqs->changeMessageVisibility(["QueueUrl" => $url,
"ReceiptHandle" => $m["ReceiptHandle"], "VisibilityTimeout" => 300]);
echo "long job ", json_decode($m["Body"])->order, PHP_EOL;
$sqs->deleteMessage(["QueueUrl" => $url, "ReceiptHandle" => $m["ReceiptHandle"]]);
}
अपेक्षित output:
long job LY-105
- Verify: queue रिकामी आहे.
aws sqs get-queue-attributes --queue-url $URL --attribute-names ApproximateNumberOfMessages ApproximateNumberOfMessagesNotVisible --output json
अपेक्षित output:
{"Attributes": {"ApproximateNumberOfMessages": "0", "ApproximateNumberOfMessagesNotVisible": "0"}}
5. खराब messages साठी dead-letter queue
हे का लागतं?
Toronto ची एक order तुटक JSON ची आहे आणि प्रत्येक वेळी worker crash करते. ती rail कायम अडवू नये.
हे काय आहे?
दुसरी queue बनवा आणि main queue वर maxReceiveCount सह RedrivePolicy लावा. DLQ तपासा, fix नंतर redrive करा.
कसं करायचं (step by step)
- Python: DLQ बनवून जोडा.
dlq = sqs.create_queue(QueueName="bakery-orders-dlq")["QueueUrl"]
arn = sqs.get_queue_attributes(QueueUrl=dlq, AttributeNames=["QueueArn"])["Attributes"]["QueueArn"]
sqs.set_queue_attributes(QueueUrl=url, Attributes={"RedrivePolicy": json.dumps(
{"deadLetterTargetArn": arn, "maxReceiveCount": "3"})})
print("dlq", arn)
अपेक्षित output:
dlq arn:aws:sqs:eu-west-3:123456789012:bakery-orders-dlq
- Node.js: DLQ मधले messages वाचा.
const dlqUrl = QueueUrl.replace("payments.fifo", "bakery-orders-dlq");
const r = await sqs.send(new ReceiveMessageCommand({ QueueUrl: dlqUrl, MessageAttributeNames: ["All"], AttributeNames: ["ApproximateReceiveCount"] }));
for (const m of r.Messages ?? []) console.log(m.Attributes.ApproximateReceiveCount, m.Body);
अपेक्षित output:
4 {order: "TO-9", total: "$12.50"
- PHP: source queue मध्ये परत redrive.
<?php
$r = $sqs->startMessageMoveTask([
"SourceArn" => "arn:aws:sqs:eu-west-3:123456789012:bakery-orders-dlq"]);
echo $r["TaskHandle"] ? "redrive started" : "no task", PHP_EOL;
अपेक्षित output:
redrive started
- Verify: redrive policy तपासा.
aws sqs get-queue-attributes --queue-url $URL --attribute-names RedrivePolicy --query Attributes.RedrivePolicy --output text
अपेक्षित output:
{"deadLetterTargetArn":"arn:aws:sqs:eu-west-3:123456789012:bakery-orders-dlq","maxReceiveCount":"3"}
6. हाच call Java, Go, .NET आणि CLI मध्ये
हे का लागतं?
Teams अनेकदा भाषा मिसळतात. Python, PHP आणि Node.js मध्ये call समजला की बाकीचे SDKs म्हणजे तोच API, फक्त syntax वेगळा.
हे काय आहे?
सगळे SendMessage API call करतात. Terminal मधून पटकन test करायला CLI ओळ वापरा.
कसं करायचं (step by step)
| Stack | Code |
|---|---|
| AWS CLI | aws sqs send-message --queue-url $URL --message-body '{"order":"LY-101"}' |
| Java v2 | sqs.sendMessage(b -> b.queueUrl(url).messageBody("{\"order\":\"LY-101\"}")); |
| Go v2 | client.SendMessage(ctx, &sqs.SendMessageInput{QueueUrl: aws.String(url), MessageBody: aws.String(body)}) |
| .NET | await sqs.SendMessageAsync(new SendMessageRequest { QueueUrl = url, MessageBody = body }); |
7. काहीही खर्च चालू राहू नये म्हणून cleanup
हे का लागतं?
चालू ठेवलेले lab resources पैसे खातात आणि security risk बनतात.
हे काय आहे?
उलट्या क्रमाने delete करा: आधी children, मग parents.
कसं करायचं (step by step)
- दोन्ही queues delete करा.
aws sqs delete-queue --queue-url $URL --region eu-west-3
aws sqs delete-queue --queue-url $DLQ_URL --region eu-west-3
अपेक्षित output:
(no output means success)
Ravindra Bagale's Tip
Worker idempotent ठेवा: standard queues किमान एकदा deliver करतात, म्हणून तीच order दोनदा येऊ शकते.
8. मुलाखत प्रश्न आणि उत्तरं
प्र. Visibility timeout म्हणजे?
Receive नंतर message किती वेळ लपतो.
प्र. Long polling का?
रिकामे responses व खर्च कमी.
प्र. Standard vs FIFO?
At-least-once vs order + exactly-once.
प्र. Message कसा delete होतो?
ReceiptHandle ने DeleteMessage.
प्र. DLQ मध्ये कधी जातो?
maxReceiveCount पेक्षा जास्त receives.
घरी करून बघा
- qty > 100 वर fail होणारा Node.js worker लिहा; DLQ मध्ये जाताना पाहा.
- PHP मधून 10 च्या batches मध्ये 25 messages पाठवा.
थोडक्यात सांगायचं तर
- CreateQueue → QueueUrl.
- Send / SendMessageBatch (10).
- Long polling ने receive.
- ReceiptHandle ने delete.
- RedrivePolicy → DLQ.
सराव Tasks
São Paulo Coffee हा साओ पाउलो मधला कॉफी व्यापार व्यवसाय आहे. Ana Souza त्यांचं IT व cloud काम पाहतात. त्यांचे पैसे BRL मध्ये मोजले जातात आणि AWS resources sa-east-1 Region मध्ये चालतात. खालच्या tasks मध्ये तुम्ही या lesson मध्ये शिकलेलं वापरून त्यांची खरी कामं करता. सगळी नावं, account IDs, IP addresses व numbers सरावासाठी काल्पनिक आहेत.
0 / 12
सोपं Queue बनवा
का: Worker तयार होईपर्यंत queue काम सुरक्षित ठेवते.
काय करायचं: spcoffee-orders queue बनवा.
- Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
- aws लिहा, मग service चं नाव, मग operation (action शब्द).
- प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
- Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.
सोपं Message पाठवा
का: Producer job queue मध्ये टाकतो व पुढे जातो.
काय करायचं: https://sqs.sa-east-1.amazonaws.com/117860693118/spcoffee-orders वर body {"orderId":"o-101"} पाठवा.
- Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
- aws लिहा, मग service चं नाव, मग operation (action शब्द).
- प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
- Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.
सोपं Queue URL शोधा
का: बहुतेक SQS commands ना URL लागतो, नाव नाही.
काय करायचं: spcoffee-orders queue चा URL मिळवा.
- Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
- aws लिहा, मग service चं नाव, मग operation (action शब्द).
- प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
- Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.
सोपं एक function invoke
का: Caller ने फक्त लागणारा function invoke करावा.
काय करायचं: फक्त arn:aws:lambda:sa-east-1:117860693118:function:spcoffee-orders-fn वर lambda:InvokeFunction allow करा.
- { "Version": "2012-10-17", "Statement": [ ... ] } ने सुरू करा.
- प्रत्येक statement मध्ये Effect, Action व Resource लिहा.
- Task ला लागेल तेवढंच द्या (least privilege).
- Double quotes व commas नीट वापरा. Check answer दाबा.
मध्यम Producer फक्त send करू शकतो
का: Web app ने jobs टाकावे पण वाचू/delete करू नये.
काय करायचं: फक्त arn:aws:sqs:sa-east-1:117860693118:spcoffee-orders वर sqs:SendMessage allow करा.
- { "Version": "2012-10-17", "Statement": [ ... ] } ने सुरू करा.
- प्रत्येक statement मध्ये Effect, Action व Resource लिहा.
- Task ला लागेल तेवढंच द्या (least privilege).
- Double quotes व commas नीट वापरा. Check answer दाबा.
मध्यम Processed message delete करा
का: Delete न केल्यास visibility timeout नंतर message परत येतो.
काय करायचं: $RH मध्ये ठेवलेल्या receipt handle चा message https://sqs.sa-east-1.amazonaws.com/117860693118/spcoffee-orders मधून delete करा.
- Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
- aws लिहा, मग service चं नाव, मग operation (action शब्द).
- प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
- Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.
मध्यम Long polling ने messages घ्या
का: Long polling messages ची वाट पाहतो, empty calls कमी.
काय करायचं: https://sqs.sa-east-1.amazonaws.com/117860693118/spcoffee-orders मधून 20 seconds पर्यंत थांबून कमाल 10 messages घ्या.
- Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
- aws लिहा, मग service चं नाव, मग operation (action शब्द).
- प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
- Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.
मध्यम Test queue रिकामी करा
का: Purge सगळे messages एकदम काढतो, फक्त test queues साठी.
काय करायचं: https://sqs.sa-east-1.amazonaws.com/117860693118/spcoffee-test queue purge करा.
- Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
- aws लिहा, मग service चं नाव, मग operation (action शब्द).
- प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
- Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.
अवघड Dead-letter queue जोडा
का: काही failed tries नंतर वाईट messages DLQ मध्ये जातात.
काय करायचं: attrs.json मधले attributes (RedrivePolicy) https://sqs.sa-east-1.amazonaws.com/117860693118/spcoffee-orders वर लावा.
- Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
- aws लिहा, मग service चं नाव, मग operation (action शब्द).
- प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
- Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.
अवघड FIFO queue बनवा
का: FIFO queues order राखतात व duplicates काढतात, उदा. payments.
काय करायचं: FifoQueue=true सह spcoffee-payments.fifo FIFO queue बनवा.
- Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
- aws लिहा, मग service चं नाव, मग operation (action शब्द).
- प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
- Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.
अवघड SQS queue Lambda ला जोडा
का: Event source mapping मुळे Lambda queue poll करून batches मध्ये messages process करतो.
काय करायचं: Queue arn:aws:sqs:sa-east-1:117860693118:spcoffee-orders पासून spcoffee-orders-fn ला batch size 10 सह event source mapping बनवा.
- Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
- aws लिहा, मग service चं नाव, मग operation (action शब्द).
- प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
- Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.
अवघड Lambda GB-seconds
का: Lambda memory × time bill करतो.
काय करायचं: 1,000,000 invocations, 512 MB, प्रत्येकी 200 ms. किती GB-seconds?
- Task मधले numbers लिहून घ्या.
- कागदावर step by step काढा.
- Box मध्ये फक्त final उत्तर लिहा.
- Check answer दाबा.
उजळणी, तुलना आणि मुलाखत cards
हा lesson काही मिनिटांत revise करा. Cards phone वर save करा किंवा PNG download करा. प्रत्येक card वरचा QR हा lesson उघडतो.




अजून cards: Ravi Sir's Cards.