13.1
Sync বনাম Async, আর Amazon SQS
queue কেন লাগে, producer আর consumer, at-least-once delivery, consumer বাড়ানো-কমানো, আর SQS-এর নিরাপত্তা।
22 মিনিট পড়া + Animation
টিপস: ডটেড-আন্ডারলাইন করা যেকোনো শব্দে ট্যাপ বা Hover করলে তার অর্থ দেখবে।
এই লেসন শেষে তুমি পারবে
- Application-এর মধ্যে synchronous আর asynchronous communication-এর তফাত বলতে, আর হঠাৎ ভিড় এলে বা একটা service বিকল হলে tightly coupled system কেন ভোগে, সেটা বোঝাতে।
- AWS-এ decoupling-এর তিনটা model-এর নাম বলতে (SQS দিয়ে queue, SNS দিয়ে pub/sub, Kinesis দিয়ে streaming), আর প্রত্যেকটা একটা message নিয়ে কী করে, এক বাক্যে বলে দিতে।
- একটা SQS standard queue বর্ণনা করতে: সীমাহীন throughput আর backlog, retention (default ৪ দিন, ১৪ দিন পর্যন্ত), message-এর size (এখন ১ MiB), at-least-once delivery আর best-effort ordering।
- একটা message-কে SendMessage, ReceiveMessage (একবারে ১০টা পর্যন্ত) আর DeleteMessage পেরিয়ে অনুসরণ করতে, আর consumer crash করলে, duplicate এলে, বা message বেশি বড় কিংবা বেশি পুরোনো হলে কী হবে, আগেই বলে দিতে।
- SQS দিয়ে web tier আর worker tier আলাদা করতে, আর database-এর সামনে SQS-কে buffer হিসেবে বসাতে।
- Queue দেখে একটা Auto Scaling group দিয়ে worker fleet বাড়াতে-কমাতে, আর backlog per instance ও desired capacity হিসাব করতে।
- একটা queue সুরক্ষিত করতে: পথে HTTPS, জমা অবস্থায় SSE-SQS বা SSE-KMS, client-side encryption, IAM policy, আর অন্য account আর S3 বা SNS-এর জন্য SQS access policy।
#Application-রা কেন সবসময় একে অপরের জন্য বসে থাকবে না
একটার বেশি application চালানো শুরু করলেই তাদের একে অপরের সাথে কথা বলতে হয়। একটা online shop-এ থাকে buying service, যেটা order নেয়, আর shipping service, যেটা courier ঠিক করে; একটা payment app-এ থাকে একটা API, যেটা টাকা পাঠানোর request নেয়, আর একটা back office, যেটা হিসাব মেলায়। এদের কথা বলার উপায় দুটো।
#Synchronous communication
Synchronous মানে সরাসরি application থেকে application: buying service shipping service-কে সরাসরি call করে (একটা HTTP request, একটা RPC), আর নিজের user-কে উত্তর দেওয়ার আগে সেই উত্তরের জন্য অপেক্ষা করে।
ব্যাপারটা সহজ, আর যে call করছে সে সাথে সাথেই জানে কাজ হলো কিনা। কিন্তু এর দাম হলো tight coupling:
- দুজনকেই একই মুহূর্তে চালু থাকতে হবে। Shipping বন্ধ থাকলে বা নতুন করে deploy হতে থাকলে buying-ও ব্যর্থ হয়, যদিও buying-এর নিজের কোনো দোষ নেই।
- যে call করে, সে পেছনের সবচেয়ে ধীর service-এর মতোই ধীর। Shipping-এর দুই সেকেন্ড লাগলে প্রত্যেক ক্রেতাকেও দুই সেকেন্ড বসে থাকতে হয়।
- ভিড় সোজা ভেতরে ঢুকে পড়ে। Order একশো গুণ বেড়ে গেলে তার প্রত্যেকটা একসাথে গিয়ে পড়ে shipping-এর ঘাড়ে, তারপর database-এর ঘাড়ে। যেটা আগে ভাঙে, সে বাকিদেরও সাথে নিয়ে পড়ে।
#Asynchronous communication
Asynchronous (event-ভিত্তিক) মানে application থেকে queue, queue থেকে application: buying service order-টা একটা queue-তে লিখে রাখে, আর সাথে সাথে ক্রেতাকে উত্তর দিয়ে দেয়; shipping service তৈরি হলে queue থেকে order তুলে নেয়।
- Producer আর consumer-কে একই সময়ে চালু থাকতে হয় না। কাজটা queue ধরে রাখে।
- দুই পক্ষই চলে নিজের গতিতে। হঠাৎ ভিড় মানে এখন একটা লম্বা queue, বিভ্রাট না।
- দুই পক্ষই আলাদাভাবে বাড়ে-কমে। Buying service-কে না ছুঁয়েই shipping worker বাড়াতে পারো, আর কয়টা worker আছে, buying service তা জানেও না।
এর খরচ: ক্রেতাকে বলা হয় “order পেয়েছি”, “order পাঠানো হয়েছে” না, তাই product-টা এমনভাবে বানাতে হয় যাতে কাজটা একটু পরে শেষ হলেও চলে (order status page, notification), আর নজর রাখার মতো system-এ একটা জিনিস বাড়ে।
Slide-এ সেই চেনা প্রশ্নটা আছে: সাধারণত তুমি ১০টা video encode করো, হঠাৎ করতে হবে ১,০০০টা। Synchronous call-এ encoding server-গুলো ভেসে যায়, request ব্যর্থ হয়। মাঝখানে একটা queue থাকলে ১,০০০টা কাজ লাইনে অপেক্ষা করে, encoder-রা যত দ্রুত পারে তুলে নেয়, আর লাইন লম্বা হলে তুমি encoder বাড়াও। Note-এও একই গল্প, e-commerce-এর Black Friday দিয়ে (আমাদের জন্য ঈদের sale): queue ছাড়া worker tier চাপে crash করে আর নতুন order নেওয়া বন্ধ হয়ে যায়; queue থাকলে web tier “success” বলতেই থাকে, আর worker-রা পরে ধরে ফেলে।
Buying service আর shipping service-এর কথা: সরাসরি, নাকি queue-এর মাধ্যমে
ঢাকার একটা online shop। Buying service ক্রেতার কাছ থেকে order নেয়; shipping service courier ঠিক করে আর order-টা database-এ লেখে। Shipping ধীর হলে, বন্ধ হয়ে গেলে, বা ঈদের sale-এ order-এর বন্যা এলে ক্রেতার কী হয়, দেখো।
পরিস্থিতি
Application থেকে সরাসরি application: যে call করে, সে উত্তরের জন্য বসে থাকে।
একজন ক্রেতা “Place order” চাপল। Buying service request-টা পেল, এখন তাকে ঠিক করতে হবে কখন উত্তর দেবে।
#Decouple করার তিন উপায়: queue, pub/sub আর stream
Asynchronous communication-এর জন্য AWS তিনটা managed model দেয়, আর এই chapter-এ প্রত্যেকটা আছে। এরা তোমার application থেকে আলাদা, নিজে নিজেই বাড়ে-কমে।
| Queue | Pub/sub | Stream | |
|---|---|---|---|
| AWS service | Amazon SQS (এই লেসন আর ১৩.২–১৩.৩) | Amazon SNS (লেসন ১৩.৪) | Kinesis Data Streams (লেসন ১৩.৫) |
| Message কে পায় | একজন consumer (consumer-রা প্রতিযোগিতা করে) | প্রত্যেক subscriber একটা করে copy পায় | প্রত্যেক consumer একই record পড়ে |
| কীভাবে আসে | Consumer টেনে নেয় (poll) | Service ঠেলে পাঠায় (push) | Consumer টেনে নেয় (enhanced fan-out-এ push হয়) |
| পড়ার পর | Consumer delete করে দেয় | কিছুই রাখা হয় না | Retention শেষ পর্যন্ত থেকে যায় (২৪ ঘণ্টা থেকে ৩৬৫ দিন); আবার replay করা যায় |
| সাধারণ কাজ | পেছনের কাজ: order, invoice, video encoding | একটা event নিয়ে অনেক system বা মানুষকে জানানো | Real-time analytics, clickstream, IoT telemetry |
Data Firehose (লেসন ১৩.৬) stream-কে storage-এ পৌঁছে দেয়, আর লেসন ১৩.৭-এ সবগুলো পাশাপাশি রাখা আছে, সাথে Amazon MQ, যেসব application আগে থেকেই standard messaging protocol-এ কথা বলে তাদের জন্য।
Queue, pub/sub নাকি stream: একটা message-এর কী হয়?
Order service ঘোষণা করে “order 1001 placed”। একই event SQS, SNS আর Kinesis Data Streams দিয়ে পাঠাও, তারপর দেখো কে কে পায়, আর পরে সেটা থেকে যায় কিনা।
পরিস্থিতি
প্রতিটা message একজন consumer-ই process করে, তারপর মুছে যায়।
Producer order-টা একটা SQS queue-তে পাঠায়। Consumer A, B আর C তিনটা একই রকম shipping worker: message পাওয়ার জন্য তারা প্রতিযোগিতা করে।
#Amazon SQS কী
Amazon Simple Queue Service (SQS) হলো একটা fully managed, serverless message queue। এখানে কোনো server, broker বা disk সামলাতে হয় না: তুমি একটা queue বানাও, API call দিয়ে তাতে message পাঠাও আর সেখান থেকে message নাও, আর AWS সেগুলো Region-এর কয়েকটা Availability Zone জুড়ে একাধিক জায়গায় জমা রাখে। এটা AWS-এর সবচেয়ে পুরোনো service: ২০০৪-এ public beta-য় আসে, ২০০৬ থেকে সবার জন্য চালু (লেসন ১.১), তাই slide-এর “১০ বছরের বেশি পুরোনো” এখন আসলে প্রায় ২০ বছর।
Microservice, distributed system আর serverless application-কে decouple করতেই এটা ব্যবহার হয়।
#Queue, producer আর consumer
- Producer queue-তে message পাঠায়। Producer অনেকগুলো হতে পারে।
- Queue প্রতিটা message জমা রাখে, যতক্ষণ না কোনো consumer সেটা delete করে।
- Consumer queue-কে poll করে, message নেয়, process করে, তারপর delete করে। Consumer-ও অনেকগুলো হতে পারে; প্রতিটা message একবারে তাদের একজনের কাছেই যায়।
Producer আর consumer হতে পারে EC2 instance, container, তোমার নিজের data centre-এর server, কিংবা Lambda function। শুধু SQS endpoint পর্যন্ত network আর সেটা call করার অনুমতি থাকলেই হলো।
#এক নজরে standard queue
SQS-এ queue দুই রকম: standard (এই লেসন আর পরেরটা) আর FIFO (লেসন ১৩.৩)। একটা standard queue-এর বৈশিষ্ট্য:
| বৈশিষ্ট্য | Standard queue |
|---|---|
| Throughput | প্রতি সেকেন্ডে প্রায় সীমাহীন API call, নিজে থেকেই বাড়ে |
| Queue-তে কত message (backlog) | সীমাহীন |
| In flight message (receive হয়েছে, delete হয়নি) | প্রতি queue-তে প্রায় ১,২০,০০০ |
| Retention | Default ৪ দিন, ১ মিনিট থেকে ১৪ দিন পর্যন্ত |
| Message-এর size | ১ byte থেকে ১ MiB (১০,৪৮,৫৭৬ byte); এর চেয়ে বড় payload S3-এ যায়, message-এ থাকে pointer |
| Body-তে কী থাকে | Text: XML, JSON বা সাধারণ text (binary হলে encode করে নিতে হয়, যেমন Base64) |
| Message attribute | প্রতি message-এ ১০টা পর্যন্ত (নাম, ধরন, মান) |
| Latency | কম: send আর receive সাধারণত কয়েক millisecond-এ হয় (নিশ্চিত কোনো সংখ্যা দেওয়া নেই) |
| Delivery | At least once: কখনো কখনো একটা message একাধিকবার আসে |
| Ordering | Best effort: message এলোমেলো ক্রমে আসতে পারে |
| দাম | মাসে প্রথম ১০ লাখ request বিনা খরচে, তারপর প্রতি ১০ লাখ request হিসেবে; payload-এর প্রতি ৬৪ KB একটা request ধরা হয় |
#Message পাঠানো (produce)
Producer SDK, CLI বা কোনো AWS service integration দিয়ে SendMessage call করে। Process করার জন্য একটা order পাঠাতে লাগে:
- body:
{"order_id": 1001, "customer_id": "C-552", "amount": 1450}, - ইচ্ছে হলে message attribute (body-র বাইরের metadata, যেমন
priority=normal), যেটা consumer body না খুলেই পড়তে পারে, - queue-র URL, যেমন
https://sqs.ap-southeast-1.amazonaws.com/111122223333/orders-example।
SQS message-টা জমা রেখে একটা message ID ফেরত দেয়। Message queue-তে থাকে যতক্ষণ না কোনো consumer সেটা delete করে, কিংবা retention-এর সময় শেষ হয়। SendMessageBatch এক call-এ ১০টা পর্যন্ত message পাঠায় (মোট ১ MiB পর্যন্ত), তাতে request আর টাকা দুটোই বাঁচে। চাইলে message visible হওয়ার আগে কিছুক্ষণ আটকেও রাখা যায় (delay queue আর timer, লেসন ১৩.২)।
#Message নেওয়া (consume)
একটা consumer একটা loop চালায়:
Poll করো
ReceiveMessage call করো, একবারে ১০টা পর্যন্ত message চাও। Long polling থাকলে (লেসন ১৩.২) call-টা খালি হাতে সাথে সাথে না ফিরে একটা message-এর জন্য ২০ সেকেন্ড পর্যন্ত অপেক্ষা করে।
Process করো
কাজটা করো: যেমন, order-টা একটা RDS database-এ insert করো, invoice email পাঠাও, ছবির মাপ বদলাও। Consumer যতক্ষণ কাজ করে, message-টা visibility timeout-এর জন্য (default ৩০ সেকেন্ড; লেসন ১৩.২) অন্য consumer-দের কাছ থেকে লুকানো থাকে।
Delete করো
Message-এর receipt handle দিয়ে DeleteMessage call করো। কেবল এখনই message-টা চলে যায়। Receive করা মানে delete করা না: এই ধাপের আগে consumer crash করলে message আবার visible হয়, আর অন্য consumer সেটা পায়।
শেষ কথাটাই SQS-কে নিরাপদ বানায়: কেউ নিশ্চিত না করা পর্যন্ত যে কাজ শেষ, message সরানো হয় না।
একটা SQS standard queue: send, receive, process, delete
একটা payment service-এর web app order-এর message বানায়; দুটো consumer সেগুলো একটা RDS database-এ insert করে। একটা message-কে SendMessage থেকে DeleteMessage পর্যন্ত অনুসরণ করো, তারপর ইচ্ছে করে জিনিস ভাঙো।
পরিস্থিতি
একটা message-এর স্বাভাবিক জীবন।
Message-টা
order_id
1001
customer_id
C-552
attribute
priority=normal
Producer SDK দিয়ে SendMessage call করে। Body হলো text (প্রায়ই JSON), সর্বোচ্চ ১ MiB, সাথে ১০টা পর্যন্ত message attribute।
#অনেক consumer: at least once, best-effort ক্রম
একই queue-কে কয়েকটা consumer poll করতে পারে। প্রত্যেকে আলাদা আলাদা message পায়, সবাই একসাথে কাজ করে, আর যে যেটা process করল, সেটা delete করে। প্রতি সেকেন্ডে আরও বেশি message process করতে চাইলে consumer horizontally বাড়াও: instance, container বা Lambda concurrency যোগ করো। Producer-এর দিকে কিছুই বদলায় না।
SQS অনেক server-এ message ছড়িয়ে রাখে বলে standard queue-এর দুটো বৈশিষ্ট্য আসে:
- At-least-once delivery। মাঝে মাঝে একটা message দুবার আসে (যেমন, তুমি delete করার সময় copy রাখা কোনো server নাগালে ছিল না)। Consumer-কে idempotent বানাও: একই message দুবার process করলে ফল যেন একবারের মতোই হয়। Order ID একটা unique constraint সহ রাখো, কিংবা টাকা কাটার আগে দেখে নাও “আগেই কাটা হয়েছে কি?”।
- Best-effort ordering। SQS পাঠানোর ক্রম রাখার চেষ্টা করে, কিন্তু message এলোমেলো ক্রমে আসতে পারে। ক্রম জরুরি হলে (bank transaction, শেয়ার কেনাবেচা) বা duplicate একেবারেই চলবে না এমন হলে FIFO queue নাও (লেসন ১৩.৩)।
নিজেকে যাচাই করোপ্রশ্ন
একটা consumer একটা message receive করল, order-টা database-এ লিখল, তারপর DeleteMessage call করার আগেই process-টা মারা গেল। Message-টার কী হবে?
#Application tier আলাদা করা
#Web tier আর worker tier
Slide-এ চেনা ছবিটা আঁকা: একটা Auto Scaling group-এ front-end web application request নেয় আর SendMessage call করে; নিজের আলাদা Auto Scaling group-এ একটা back-end processing application ReceiveMessage call করে; মাঝখানে একটা SQS queue, যেটা কার্যত অসীম পর্যন্ত বাড়তে পারে।
- Web tier দ্রুত থাকে, কারণ সে শুধু তাড়াতাড়ির অংশটুকু করে (যাচাই, queue-তে রাখা, উত্তর)।
- Worker tier ধীর অংশটা করে (video processing, invoice, payment, email) নিজের গতিতে, সেই কাজের জন্য বেছে নেওয়া instance type-এ (যেমন video-র জন্য GPU instance)।
- প্রত্যেক tier নিজের metric দেখে বাড়ে-কমে: web tier request দেখে, worker tier queue দেখে।
এটাই note-এর e-commerce উদাহরণ। SQS না থাকলে Black Friday-র ভিড়ে worker tier crash করতে পারে, তখন নতুন order দেওয়াই যায় না। SQS থাকলে web tier প্রতিটা order queue-তে পাঠিয়ে user-কে “success” দেখায়; worker-রা নিজের সামর্থ্য মতো order টেনে নেয়; worker-এর ওপর চাপ কখনো user পর্যন্ত পৌঁছায় না। Elastic Beanstalk-এর worker environment (লেসন ৯.৪) হুবহু এই pattern, প্যাকেট করে দেওয়া।
#Database-এর সামনে buffer হিসেবে SQS
Slide-এ সমস্যাটার আরেকটা রূপও আছে। একটা Auto Scaling group-এর application transaction সরাসরি database-এ লেখে (RDS, Aurora বা DynamoDB)। Load খুব বেশি হলে database-এর connection বা লেখার ক্ষমতা ফুরিয়ে যায়, insert ব্যর্থ হয়, আর কিছু transaction হারিয়ে যেতে পারে।
সামনে একটা queue বসাও: application প্রতিটা transaction queue-তে রাখে (SendMessage), আর একদল worker সেটা queue থেকে তোলে (ReceiveMessage), তারপর এমন গতিতে insert করে, যেটা database সইতে পারে। ভিড়টা queue শুষে নেয়; কিছুই হারায় না; database পায় স্থির load। বিনিময়ে লেখাটা আর সাথে সাথে হয় না, তাই এটা মানায় এমন লেখায়, যেটা user পরের সেকেন্ডেই পড়ে দেখতে চায় না (order, log, হিসাব মেলানোর payment), এমন profile update-এ না, যেটা user সাথে সাথে দেখতে চায়।
#Auto Scaling group দিয়ে consumer বাড়ানো-কমানো
Queue ঠিক বলে দেয় কতটা কাজ অপেক্ষায় আছে, worker বাড়ানো-কমানোর জন্য এর চেয়ে ভালো সংকেত হয় না।
#Note-এর উপায়: queue length-এর ওপর একটা alarm
Note-এর উদাহরণ: হঠাৎ ১০,০০০টা message এল, কিন্তু EC2 instance মাত্র ২টা, তাই process করতে অনেক সময় লাগবে। কাজটা চলে এভাবে:
- SQS CloudWatch-এ ApproximateNumberOfMessagesVisible metric পাঠায়, মানে কতগুলো message process হওয়ার জন্য তৈরি (slide একে বলে queue length,
ApproximateNumberOfMessages, queue attribute হিসেবে একই সংখ্যা)। - একটা সীমা পেরোলে, যেমন ১,০০০, একটা CloudWatch alarm বাজে।
- Alarm-টা Auto Scaling group-এর একটা scaling policy চালু করে, যেটা instance বাড়ায় (scale out)। Queue ছোট হলে আরেকটা alarm সেগুলো সরায় (scale in)।
এটা কাজ করে, আর slide-এ এটাই আঁকা। তবে দুটো সংশোধন আছে। Note-এ policy-টাকে বলা হয়েছে “Step Tracking”: এমন কিছু নেই। Policy-র ধরন হলো step scaling (আর simple scaling) আর target tracking (লেসন ৬.৫)। আর raw queue length-এর ওপর বাঁধা একটা সীমার দুর্বলতা আছে: আগে থেকে কয়টা worker আছে, সেটা সে জানে না। Instance যোগ করলে queue length সেই অনুপাতে কমে না, তাই queue কমতে থাকলেও alarm লাল থেকে যায় আর instance যোগ করতেই থাকে, কিংবা সীমার আশেপাশে ওঠানামা করে দোল খায়।
#ভালো উপায়: backlog per instance
AWS-এর পরামর্শ: backlog per instance-এর ওপর একটা target tracking policy।
- Backlog per instance = visible message ÷ চালু (
InService) instance-এর সংখ্যা। - Target (গ্রহণযোগ্য backlog per instance) = একটা message সর্বোচ্চ যতক্ষণ অপেক্ষা করতে পারে ÷ একটা instance-এর একটা message process করতে গড়ে যত সময় লাগে।
AWS-এর নিজের উদাহরণ: ১০টা instance, ১,৫০০টা visible message, প্রতি message-এ ০.১ সেকেন্ড, অপেক্ষা সর্বোচ্চ ১০ সেকেন্ড। Target = ১০ ÷ ০.১ = প্রতি instance-এ ১০০টা message। এখন backlog per instance ১,৫০০ ÷ ১০ = ১৫০, target-এর ওপরে, তাই group বেড়ে হয় ১,৫০০ ÷ ১০০ = ১৫টা instance।
এটা আর কোনো script দিয়ে custom metric হিসেবে publish করতে হয় না: target tracking policy SQS-এর metric আর group-এর GroupInServiceInstances metric থেকে metric math দিয়েই হিসাব করে নেয়। Policy-টা লেসন ৬.৫-এ দেখানো আছে; এখানে দেখো fleet-এর ওপর সেটা কী করে।
SQS আর Auto Scaling group: backlog দেখে বাড়া-কমা
একটা Auto Scaling group-এর worker-রা queue poll করে। প্রতিটা message-এ লাগে ০.৫ সেকেন্ড, আর একটা order সর্বোচ্চ ২৫০ সেকেন্ড অপেক্ষা করতে পারে, তাই target হলো ২৫০ ÷ ০.৫ = প্রতি instance-এ ৫০০টা message। দেখো group কীভাবে backlog-এর পিছু পিছু চলে।
পরিস্থিতি
Backlog per instance-এর ওপর target tracking ঠিক যতগুলো worker দরকার, ততগুলোই যোগ করে।
Queue আর fleet
| Visible message | চালু instance | Backlog per instance | Target |
|---|---|---|---|
| 400 | 2 | 200 | 500 |
একটা সাধারণ সন্ধ্যা: ৪০০টা message অপেক্ষায়, ২টা worker, মানে প্রতি instance-এ ২০০টা। এটা ৫০০-এর target-এর নিচে, তাই কিছুই বদলায় না।
নিজের সংখ্যা দিয়ে চেষ্টা করো, note-এর ১০,০০০টা message আর ২টা instance সহ:
Backlog per instance-এর হিসাব
ঢাকার একটা online shop-এ ঈদের sale: order-এর message একটা SQS queue-তে জমছে, আর একটা Auto Scaling group-এর EC2 worker-রা (সর্বোচ্চ ৪০টা instance) সেগুলো process করে। সংখ্যাগুলো বেছে নাও, তারপর হিসাব করো একটা target tracking policy কী করত।
অপেক্ষায় থাকা message (ApproximateNumberOfMessagesVisible)
একটা message process করতে সময়
সর্বোচ্চ যতক্ষণ অপেক্ষা চলে
এখন চালু instance
ফল দেখতে “হিসাব করো” চাপো।
Production-এ যে দুটো খুঁটিনাটি জরুরি:
- Scale-in-এ message নিরাপদ। কোনো instance হাতে message নিয়ে বন্ধ হলে, message-টা তো কখনো delete হয়নি, তাই visibility timeout-এর পর ফিরে আসে। লম্বা কাজের জন্য worker ব্যস্ত থাকার সময় instance scale-in protection চালু রাখো, যাতে group আগে অলস worker-গুলো বন্ধ করে।
- Lambda নিজেই বাড়ে। Consumer যদি SQS event source mapping সহ একটা Lambda function হয়, Lambda নিজেই queue poll করে আর concurrency বাড়ায়; সেখানে কোনো Auto Scaling group নেই (serverless chapter, লেসন ১৫.১)।
#SQS-এর নিরাপত্তা
#Encryption
| কোথায় | কীভাবে |
|---|---|
| পথে (in flight) | SQS API হলো HTTPS, তাই message যায় TLS দিয়ে encrypt হয়ে। Queue policy দিয়ে TLS ছাড়া আসা যেকোনো request deny করা যায় (condition aws:SecureTransport = false)। |
| জমা অবস্থায়, SSE-SQS | SQS-এর নিজের মালিকানার, নিজের দেখভালের key দিয়ে server-side encryption। বিনা খরচে, সামলানোর কিছু নেই। ২০২২-এর শেষ থেকে নতুন queue-তে default-এ চালু। |
| জমা অবস্থায়, SSE-KMS | একটা KMS key দিয়ে server-side encryption: AWS managed key alias/aws/sqs, অথবা একটা customer managed key। Key policy তুমি ঠিক করো, প্রতিটা ব্যবহার CloudTrail-এ log হয়, আর KMS request-এর খরচ দিতে হয় (খরচ কমাতে SQS একটা data key ১ মিনিট থেকে ২৪ ঘণ্টা পর্যন্ত বারবার ব্যবহার করে, default ৫ মিনিট)। |
| Client-side | Producer SendMessage-এর আগে নিজেই body encrypt করে, আর consumer decrypt করে, তাই খোলা text AWS কখনো দেখে না। |
Note-এ SSE-SQS-কে KMS-এর নিচে রাখা হয়েছে; ঠিকভাবে বললে, শুধু SSE-KMS-ই AWS KMS ব্যবহার করে। SSE-SQS-এর key SQS নিজের ভেতরেই সামলায়। যেটাই নাও, SSE encrypt করে message-এর body; queue-র নাম, message attribute, message ID আর metric encrypt হয় না, তাই attribute-এ গোপন কিছু রেখো না। Encryption চালু করার পরে পাঠানো message-এই কেবল সেটা খাটে। KMS নিজে আছে লেসন ২১.২-এ; S3-এর জন্য SSE-S3 বনাম SSE-KMS-এর একই বাছাই দেখেছিলে লেসন ১০.৮-এ।
#Access control: IAM policy আর SQS access policy
Queue কে call করতে পারবে, তা ঠিক করে দুই রকম policy (লেসন ২.১ আর ২.২):
| IAM policy | SQS access policy (queue policy) | |
|---|---|---|
| কোথায় লাগানো | একটা user, group বা role-এ (যেমন worker-এর EC2 instance role) | Queue-এর গায়ে; resource-based policy, S3 bucket policy-র মতো |
| কী লেখা থাকে | Action আর resource (queue ARN-এ sqs:SendMessage) | একটা Principal, সাথে action, resource আর condition |
| একাই যথেষ্ট | একই account-এর caller-দের জন্য | অন্য account আর AWS service-কে অনুমতি দিতে |
| সাধারণ ব্যবহার | Web tier পাঠাতে পারবে, worker tier receive আর delete করতে পারবে | Account 444455556666 পাঠাতে পারবে; S3-এর event notification বা একটা SNS topic পাঠাতে পারবে |
Note-এর পরীক্ষার কৌশল, slide-ও একই কথা বলে: “অন্য একটা AWS account-কে তোমার queue-তে message পাঠাতে দাও” বা “S3-কে (বা SNS-কে) তোমার queue-তে message পাঠাতে দাও” → SQS access policy। অন্য account-এর বেলায় দুই পক্ষকেই রাজি হতে হয়: queue policy account B-কে অনুমতি দেয়, আর account B-র নিজের IAM policy তার user বা role-কে SQS call করার অনুমতি দেয়।
একটা queue policy, যেটা একটা S3 bucket-কে তার event notification (লেসন ১০.৭) queue-তে পাঠাতে দেয়, আর শুধু ওই bucket-কেই:
{
"Version": "2012-10-17",
"Statement": [{
"Sid": "AllowS3Events",
"Effect": "Allow",
"Principal": { "Service": "s3.amazonaws.com" },
"Action": "sqs:SendMessage",
"Resource": "arn:aws:sqs:ap-southeast-1:111122223333:orders-example",
"Condition": {
"ArnLike": { "aws:SourceArn": "arn:aws:s3:::uploads-example" },
"StringEquals": { "aws:SourceAccount": "111122223333" }
}
}]
}
Condition-গুলো জরুরি: এগুলো ছাড়া যেকোনো account-এর যেকোনো bucket S3-এর মাধ্যমে তোমার queue-তে পাঠাতে পারত (“confused deputy” সমস্যা)। আরেকটা ফাঁদ: queue যদি AWS managed key alias/aws/sqs দিয়ে SSE-KMS ব্যবহার করে, S3 আর SNS তাতে পাঠাতে পারে না, কারণ ওই key-এর policy বদলে ওদের ব্যবহারের অনুমতি দেওয়া যায় না। এমন একটা customer managed key নাও, যার key policy service-টাকে kms:GenerateDataKey আর kms:Decrypt-এর অনুমতি দেয়।
SQS-এর নিরাপত্তা: IAM, queue policy আর encryption
Account 111122223333-এ একটা queue। একই account-এর একটা worker, account 444455556666-এর একটা partner app, আর একটা S3 bucket-এর event notification, সবাই এটা ব্যবহার করতে চায়।
পরিস্থিতি
একটা account-এর ভেতরে IAM policy-ই যথেষ্ট।
Worker একটা IAM role নিয়ে চলে, যার policy এই queue-র ARN-এ sqs:ReceiveMessage আর sqs:DeleteMessage-এর অনুমতি দেয়। একই account-এ শুধু এই identity policy-ই যথেষ্ট।
শেষে network-এর কথা: NAT gateway ছাড়া private subnet-এর worker-রাও একটা interface VPC endpoint (AWS PrivateLink) দিয়ে SQS-এ পৌঁছাতে পারে, আর queue policy দিয়ে বাধ্য করা যায় যে request ওই পথেই আসতে হবে (aws:SourceVpce)। বিস্তারিত লেসন ২২.২-এ।
#কোথায় গোলমাল হয়
| লক্ষণ | সম্ভাব্য কারণ | সমাধান |
|---|---|---|
| একই order মাঝে মাঝে দুবার process হয় | Standard queue at least once deliver করে; অথবা কাজ শেষে কিন্তু DeleteMessage-এর আগে consumer crash করেছে | Consumer idempotent বানাও; duplicate একেবারে না চললে FIFO |
| Message বারবার process হয়, কখনো যায় না | Consumer কখনো DeleteMessage call করে না (বা প্রতিবার ব্যর্থ হয়) | সফল হলে delete করো; বারবার ব্যর্থ message-এর জন্য dead-letter queue রাখো (লেসন ১৩.২) |
| Process না হয়েই message উধাও | Consumer retention-এর চেয়ে বেশি সময় বন্ধ ছিল (default ৪ দিন) | Retention বাড়াও (১৪ দিন পর্যন্ত); ApproximateAgeOfOldestMessage-এ alarm রাখো |
| বড় payload-এ SendMessage ব্যর্থ | Message ১ MiB-এর চেয়ে বড় (পুরোনো client আর doc-এ ২৫৬ KiB) | Payload S3-এ রাখো, pointer পাঠাও (Extended Client Library) |
| Payment ভুল ক্রমে বসছে | Standard queue-তে best-effort ordering | প্রতি account-এ একটা message group সহ FIFO queue (লেসন ১৩.৩) |
| ঘণ্টার পর ঘণ্টা backlog বাড়ছে, অথচ worker-দের CPU কম | Group CPU দেখে বাড়ে, যেটা queue-র অবস্থা বোঝায় না | Backlog per instance দেখে বাড়াও |
| Queue কমতে থাকলেও group instance যোগ করতেই থাকে, তারপর দোল খায় | কড়া সীমা দিয়ে raw queue length-এর ওপর step scaling | Backlog per instance-এর ওপর target tracking |
| অন্য account SendMessage-এ AccessDenied পায় | সেই account-এর জন্য queue policy নেই, বা তার নিজের IAM policy নেই | Account-কে Principal করে queue policy, সাথে সেই account-এ IAM |
| S3 বলে event destination যাচাই করতে পারছে না | Queue policy s3.amazonaws.com-কে অনুমতি দেয় না | aws:SourceArn সহ statement যোগ করো |
| Encrypt করা queue-তে S3 বা SNS তবুও পৌঁছাতে পারে না | Queue alias/aws/sqs দিয়ে SSE-KMS ব্যবহার করে | এমন customer managed key, যার key policy service-টাকে অনুমতি দেয় |
| Private subnet-এর worker-দের SQS call timeout হয় | NAT gateway নেই, VPC endpoint-ও নেই | SQS-এর জন্য interface VPC endpoint |
| Short polling-এ অনেক খালি উত্তর আসে, bill বাড়ে | প্রতিটা খালি ReceiveMessage-ও bill হওয়া request | Long polling, ২০ সেকেন্ড অপেক্ষা (লেসন ১৩.২) |
#System design-এ SQS
- Web tier / worker tier। Front end শুধু যাচাই করে queue-তে রাখে; ধীর কাজ (video encoding, invoice file, email, ছবির মাপ বদলানো) চলে worker-এ, যেগুলো backlog দেখে বাড়ে-কমে। User দ্রুত উত্তর পায়, worker-এর বিভ্রাট কখনো টেরও পায় না।
- Database-এর জন্য লেখার buffer। হঠাৎ একগাদা লেখা সামলাও, যাতে RDS, Aurora বা DynamoDB-র মাপ হয় স্বাভাবিক load-এর, সবচেয়ে ব্যস্ত মুহূর্তের না।
- Microservice decoupling। Service-রা একে অপরকে call না করে queue-তে কাজ রাখে, তাই একটা service-এর deployment বা বিকল বাকিদের মধ্যে ছড়ায় না।
- Event-এর গন্তব্য। S3 event notification (লেসন ১০.৭), SNS topic (লেসন ১৩.৪) আর EventBridge rule (লেসন ১৯.৫) একটা queue-তে পৌঁছে দিতে পারে, তাই event-এর ঝাঁক নিয়ন্ত্রিত গতিতে process হয়।
- খরচ আর Spot। Worker হারালেও message টিকে থাকে বলে queue worker Spot Instance-এর জন্য দারুণ মানানসই: interruption মানে শুধু message-টা অন্য কেউ process করবে (লেসন ৪.৪)।
- যা এটা না। SQS database না (query নেই, retention সর্বোচ্চ ১৪ দিন), broadcast system না (তার জন্য SNS), আর replay করার মতো log-ও না (তার জন্য Kinesis)।
#নিজে করে দেখো
একটা queue বানাও, একটা message পাঠাও আর নাও, তার attribute দেখো, আর queue-র metric পড়ো। Output ছোট করে দেখানো।
# 1. Create a standard queue: 4-day retention by default; set 14 days (in seconds)
aws sqs create-queue --queue-name orders-example \
--attributes MessageRetentionPeriod=1209600 --region ap-southeast-1
# { "QueueUrl": "https://sqs.ap-southeast-1.amazonaws.com/111122223333/orders-example" }
Q=https://sqs.ap-southeast-1.amazonaws.com/111122223333/orders-example
# 2. Check the defaults: visibility 30 s, max size 1 MiB, SSE-SQS on
aws sqs get-queue-attributes --queue-url $Q --attribute-names All
# "VisibilityTimeout": "30", "MaximumMessageSize": "1048576",
# "MessageRetentionPeriod": "1209600", "SqsManagedSseEnabled": "true", ...
# 3. Produce: a body plus one message attribute
aws sqs send-message --queue-url $Q \
--message-body '{"order_id":1001,"customer_id":"C-552","amount":1450}' \
--message-attributes 'priority={DataType=String,StringValue=normal}'
# { "MD5OfMessageBody": "6b1e1c...", "MessageId": "5fea7756-0ea4-451a-a703-a558b933e274" }
# 4. Consume: up to 10 messages, waiting up to 20 s (long polling)
aws sqs receive-message --queue-url $Q --max-number-of-messages 10 \
--wait-time-seconds 20 --message-attribute-names All
# { "Messages": [{ "MessageId": "5fea7756-...", "ReceiptHandle": "AQEBzbVv...",
# "Body": "{\"order_id\":1001,...}" }] }
# 5. Delete it with the receipt handle (not the message ID)
aws sqs delete-message --queue-url $Q --receipt-handle "AQEBzbVv..."
# 6. Look at the backlog: the attribute, and the CloudWatch metric the ASG uses
aws sqs get-queue-attributes --queue-url $Q \
--attribute-names ApproximateNumberOfMessages ApproximateNumberOfMessagesNotVisible
aws cloudwatch get-metric-statistics --namespace AWS/SQS \
--metric-name ApproximateNumberOfMessagesVisible \
--dimensions Name=QueueName,Value=orders-example \
--start-time 2026-10-26T00:00:00Z --end-time 2026-10-26T01:00:00Z \
--period 300 --statistics Average
# 7. Allow account 444455556666 to send (queue policy from a file)
aws sqs set-queue-attributes --queue-url $Q --attributes file://policy.json
# 8. Switch to SSE-KMS with your own key, then clean up
aws sqs set-queue-attributes --queue-url $Q \
--attributes KmsMasterKeyId=alias/orders-key,KmsDataKeyReusePeriodSeconds=300
aws sqs delete-queue --queue-url $Q
policy.json-এ থাকে {"Policy": "<queue policy, escape করা JSON string হিসেবে>"}। ধাপ ৫ বাদ দিয়ে ধাপ ৪ দুবার চালাও, মাঝে ৩০ সেকেন্ড অপেক্ষা করো: একই message নতুন একটা receipt handle নিয়ে ফিরে আসে। এটাই visibility timeout, পরের লেসনের বিষয়।
#সারসংক্ষেপ
মূল কথাগুলো
- Synchronous (application থেকে application) service-দের বেঁধে ফেলে: দুজনকেই চালু থাকতে হয়, caller সবচেয়ে ধীরজনের মতো ধীর, ভিড় সোজা ভেতরে ঢোকে। Asynchronous (application থেকে queue, queue থেকে application) প্রত্যেক পক্ষকে নিজের মতো চলতে, বিকল হতে আর বাড়তে-কমতে দেয়।
- তিনটা model: queue (SQS), প্রতিটা message একজন consumer-এর, process শেষে মুছে যায়; pub/sub (SNS), প্রত্যেক subscriber-কে একটা করে copy ঠেলে পাঠানো; stream (Kinesis), record থেকে যায়, অনেক reader আবার পড়তে পারে। লেসন ১৩.৪, ১৩.৫, ১৩.৭।
- SQS standard: fully managed, serverless, প্রায় সীমাহীন throughput, সীমাহীন backlog, retention default ৪ দিন, ১ মিনিট থেকে ১৪ দিন, message ১ MiB পর্যন্ত (আগস্ট ২০২৫-এর আগে ২৫৬ KB; বড় হলে S3 pointer), at-least-once delivery, best-effort ordering, কম latency।
- পাঠাতে SendMessage; নিতে ReceiveMessage (১০টা পর্যন্ত); process শেষে DeleteMessage। Receive করলে message শুধু লুকায়, মোছে না, তাই crash মানে আবার deliver। Consumer-কে idempotent হতে হবে।
- Web আর worker tier decouple করো, database-এর লেখা buffer করো, যাতে ভিড় মানে হয় লম্বা queue, হারানো transaction না।
- Queue-র metric ApproximateNumberOfMessagesVisible দেখে Auto Scaling group দিয়ে worker বাড়াও-কমাও; সবচেয়ে ভালো backlog per instance-এর ওপর target tracking (target = গ্রহণযোগ্য অপেক্ষা ÷ প্রতি message-এর সময়)। “Step Tracking” কোনো policy-র ধরন না।
- নিরাপত্তা: পথে HTTPS; জমা অবস্থায় SSE-SQS (default, বিনা খরচে) বা SSE-KMS (তোমার key policy, CloudTrail, KMS-এর খরচ); পুরো নিয়ন্ত্রণ চাইলে client-side encryption। নিজের account-এর জন্য IAM policy; অন্য account আর queue-তে পাঠানো S3 / SNS-এর জন্য SQS access policy (
aws:SourceArnসহ, আর queue SSE-KMS হলে customer managed KMS key)।
আগে নিজে উত্তর দাও, তারপর ব্যাখ্যাটা পড়ো। ঠিক হলেও পড়ো, কারণ ভুল Option-গুলো কেন ভুল, সেটাও ওখানে আছে।
নিজেকে যাচাই করোপ্রশ্ন
Amazon SQS কী?
নিজেকে যাচাই করোপ্রশ্ন
একটা SQS queue-তে message retention-এর default আর সর্বোচ্চ সময় কত?
নিজেকে যাচাই করোপ্রশ্ন
আগস্ট ২০২৫ থেকে একটা SQS message-এর সর্বোচ্চ size কত?
নিজেকে যাচাই করোপ্রশ্ন
একটা ReceiveMessage call সর্বোচ্চ কয়টা message ফেরত দিতে পারে?
নিজেকে যাচাই করোপ্রশ্ন
কোন দুটো কথা একটা SQS standard queue-কে বোঝায়?
বেছে নাও ২
নিজেকে যাচাই করোপ্রশ্ন
সফলভাবে process হওয়ার পর একটা message SQS queue থেকে কে সরায়?
নিজেকে যাচাই করোপ্রশ্ন
একটা consumer SQS থেকে message পায় কীভাবে?
নিজেকে যাচাই করোপ্রশ্ন
একটা online shop-এর web tier order-processing tier-কে synchronous ভাবে call করে। বড় sale-এর সময় processing tier চাপে crash করে, আর গ্রাহকেরা কোনো order-ই দিতে পারে না। সবচেয়ে কম খাটুনিতে কোন বদল এটা ঠিক করবে?
নিজেকে যাচাই করোপ্রশ্ন
একটা media company সাধারণত ঘণ্টায় প্রায় ১০টা video encode করে, কিন্তু একটা campaign-এর পর এক ঘণ্টায় ১,০০০টা upload এল। Synchronous ভাবে call করা encoding server timeout হচ্ছে, upload ব্যর্থ হচ্ছে। সবচেয়ে ভালো design কোনটা?
নিজেকে যাচাই করোপ্রশ্ন
মাসের শেষে একটা payment API transaction সরাসরি একটা Aurora database-এ লেখে। সবচেয়ে ব্যস্ত সময়ে database-এর connection ফুরিয়ে যায়, কিছু transaction হারায়। User-দের database-এ transaction সাথে সাথে দেখার দরকার নেই। Architect-এর কী করা উচিত?
নিজেকে যাচাই করোপ্রশ্ন
পরীক্ষার প্রশ্নে কোন দুটো কথা Amazon SQS-এর দিকে ইঙ্গিত করে?
বেছে নাও ২
নিজেকে যাচাই করোপ্রশ্ন
একটা order হলেই kitchen system, rider app আর SMS service, তিনজনকেই একসাথে জানাতে হবে, প্রত্যেককে নিজের copy দিয়ে। কোন model মানায়?
নিজেকে যাচাই করোপ্রশ্ন
একটা analytics team-এর দরকার, কয়েকটা application real time-এ একই click event পড়বে, আর একটা bug ঠিক করার পর গতকালের event আবার পড়া যাবে। কোন service মানায়?
নিজেকে যাচাই করোপ্রশ্ন
একটা wallet app-এর worker-রা একটা SQS standard queue থেকে top-up request পড়ে। কয়েক হাজারে একবার কোনো গ্রাহকের account-এ টাকা দুবার জমা হয়। কোন বদল আসল কারণটা সামলায়?
নিজেকে যাচাই করোপ্রশ্ন
১০টা worker-এর একটা Auto Scaling group একটা SQS queue পড়ে, যেখানে ১,৫০০টা visible message। প্রতিটা message-এ ০.১ সেকেন্ড লাগে, আর কোনো message ১০ সেকেন্ডের বেশি অপেক্ষা করবে না। Backlog per instance-এর ওপর target tracking থাকলে group কয়টা instance-এ যাবে?
নিজেকে যাচাই করোপ্রশ্ন
Note-এর উদাহরণ: ১০,০০০টা message অপেক্ষায়, ২টা worker চালু। প্রতিটা message-এ ০.৫ সেকেন্ড লাগে, আর একটা message সর্বোচ্চ ২৫০ সেকেন্ড অপেক্ষা করতে পারে। Target backlog per instance কত, আর কয়টা worker লাগবে?
নিজেকে যাচাই করোপ্রশ্ন
একটা queue-তে ১০,০০০টা message অপেক্ষায়, প্রতিটা process করতে ০.৫ সেকেন্ড লাগে, আর scaling ছাড়া ২টা worker চলছে। নতুন message না এলে queue মোটামুটি কতক্ষণে খালি হবে?
নিজেকে যাচাই করোপ্রশ্ন
SQS worker-দের একটা Auto Scaling group কোন metric দেখে চলা উচিত?
নিজেকে যাচাই করোপ্রশ্ন
SQS-এর metric দেখে একটা Auto Scaling group বাড়াতে-কমাতে কোন দুটো আসল scaling policy-র ধরন ব্যবহার করা যায়?
বেছে নাও ২
নিজেকে যাচাই করোপ্রশ্ন
Scale in করার সময় একটা Auto Scaling group এমন একটা worker বন্ধ করে দিল, যে একটা message receive করেছিল কিন্তু তখনো delete করেনি। Message-টার কী হবে, আর লম্বা কাজ কীভাবে বাঁচানো যায়?
নিজেকে যাচাই করোপ্রশ্ন
Account 444455556666-এর একটা application-কে account 111122223333-এর একটা queue-তে message পাঠাতে হবে। Application-এর IAM role আগেই queue ARN-এ sqs:SendMessage-এর অনুমতি দেয়, কিন্তু call AccessDenied দিয়ে ব্যর্থ হয়। কী বাকি আছে?
নিজেকে যাচাই করোপ্রশ্ন
তুমি একটা S3 bucket-কে বললে object-created event notification একটা SQS queue-তে পাঠাতে, আর S3 এই error দিয়ে ফিরিয়ে দিল যে সে destination যাচাই করতে পারছে না। কী করবে?
নিজেকে যাচাই করোপ্রশ্ন
Queue policy ঠিক করার পরেও S3 এমন একটা queue-তে event পৌঁছাতে পারছে না, যেটা AWS managed key alias/aws/sqs দিয়ে SSE-KMS-এ encrypt করা। কেন, আর সমাধান কী?
নিজেকে যাচাই করোপ্রশ্ন
EC2-এর একটা worker-কে একই account-এর একটা queue থেকে message receive আর delete করতে হবে। অনুমতি দেওয়ার সবচেয়ে সহজ সঠিক উপায় কোনটা?
নিজেকে যাচাই করোপ্রশ্ন
SQS encryption নিয়ে কোন দুটো কথা ঠিক?
বেছে নাও ২
নিজেকে যাচাই করোপ্রশ্ন
SQS standard queue নিয়ে কোন কথাটা সত্য না?
নিজেকে যাচাই করোপ্রশ্ন
একটা reporting service-কে SQS দিয়ে একটা worker-এর কাছে ৩ MiB-এর একটা বানানো report পাঠাতে হবে। পরামর্শ দেওয়া উপায় কোনটা?
নিজেকে যাচাই করোপ্রশ্ন
লম্বা ছুটির আগে এক বৃহস্পতিবার ভুল করে একটা SQS queue-র worker-গুলো বন্ধ করে দেওয়া হলো। পাঁচ দিন পরে মঙ্গলবার আবার চালু করার পর দেখা গেল, বৃহস্পতিবারের অনেক order queue-তে নেই। কী হয়েছিল, আর কীভাবে আটকানো যায়?
নিজেকে যাচাই করোপ্রশ্ন
কোন দুটো ক্ষেত্রে শুধু IAM policy যথেষ্ট না, একটা SQS access policy (queue policy) লাগে?
বেছে নাও ২
নিজেকে যাচাই করোপ্রশ্ন
NAT gateway বা internet ছাড়া একটা private subnet-এর EC2 worker-দের একটা SQS queue poll করতে হবে। Call timeout হচ্ছে। সবচেয়ে নিরাপদ সমাধান কোনটা?
নিজেকে যাচাই করোপ্রশ্ন
Sync আর async communication নিয়ে কোন দুটো কথা ঠিক?
বেছে নাও ২