Course-এর সূচি

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 করে, সে উত্তরের জন্য বসে থাকে।

ক্রেতা
Buying serviceweb tier
SQS queue
Shipping serviceworker tier
Database
POST /order
ধাপ 1 / 4
1

একজন ক্রেতা “Place order” চাপল। Buying service request-টা পেল, এখন তাকে ঠিক করতে হবে কখন উত্তর দেবে।

#Decouple করার তিন উপায়: queue, pub/sub আর stream

Asynchronous communication-এর জন্য AWS তিনটা managed model দেয়, আর এই chapter-এ প্রত্যেকটা আছে। এরা তোমার application থেকে আলাদা, নিজে নিজেই বাড়ে-কমে।

QueuePub/subStream
AWS serviceAmazon 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 করে, তারপর মুছে যায়।

Order serviceproducer
SQS queue
Consumer A
Consumer B
Consumer C
order 1001
ধাপ 1 / 3
1

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-তে প্রায় ১,২০,০০০
RetentionDefault ৪ দিন, ১ মিনিট থেকে ১৪ দিন পর্যন্ত
Message-এর size১ byte থেকে ১ MiB (১০,৪৮,৫৭৬ byte); এর চেয়ে বড় payload S3-এ যায়, message-এ থাকে pointer
Body-তে কী থাকেText: XML, JSON বা সাধারণ text (binary হলে encode করে নিতে হয়, যেমন Base64)
Message attributeপ্রতি message-এ ১০টা পর্যন্ত (নাম, ধরন, মান)
Latencyকম: send আর receive সাধারণত কয়েক millisecond-এ হয় (নিশ্চিত কোনো সংখ্যা দেওয়া নেই)
DeliveryAt least once: কখনো কখনো একটা message একাধিকবার আসে
OrderingBest 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 চালায়:

  1. Poll করো

    ReceiveMessage call করো, একবারে ১০টা পর্যন্ত message চাও। Long polling থাকলে (লেসন ১৩.২) call-টা খালি হাতে সাথে সাথে না ফিরে একটা message-এর জন্য ২০ সেকেন্ড পর্যন্ত অপেক্ষা করে।

  2. Process করো

    কাজটা করো: যেমন, order-টা একটা RDS database-এ insert করো, invoice email পাঠাও, ছবির মাপ বদলাও। Consumer যতক্ষণ কাজ করে, message-টা visibility timeout-এর জন্য (default ৩০ সেকেন্ড; লেসন ১৩.২) অন্য consumer-দের কাছ থেকে লুকানো থাকে।

  3. 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-এর স্বাভাবিক জীবন।

Web appproducer
orders-examplestandard
Consumer 1
Consumer 2
RDS
SendMessage

Message-টা

order_id

1001

customer_id

C-552

attribute

priority=normal

ধাপ 1 / 5
1

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 করতে অনেক সময় লাগবে। কাজটা চলে এভাবে:

  1. SQS CloudWatch-এ ApproximateNumberOfMessagesVisible metric পাঠায়, মানে কতগুলো message process হওয়ার জন্য তৈরি (slide একে বলে queue length, ApproximateNumberOfMessages, queue attribute হিসেবে একই সংখ্যা)।
  2. একটা সীমা পেরোলে, যেমন ১,০০০, একটা CloudWatch alarm বাজে।
  3. 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 দরকার, ততগুলোই যোগ করে।

Auto Scaling group
SQS queue
Worker 1
Worker 2
CloudWatch alarm
Scaling policy
ReceiveMessage

Queue আর fleet

Visible messageচালু instanceBacklog per instanceTarget
4002200500
ধাপ 1 / 5
1

একটা সাধারণ সন্ধ্যা: ৪০০টা 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-SQSSQS-এর নিজের মালিকানার, নিজের দেখভালের 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-sideProducer 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 policySQS 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-ই যথেষ্ট।

Account B
Account A
Partner app444455556666
S3 bucketevent notification
orders-example
WorkerIAM role
KMS key
ReceiveMessage
ধাপ 1 / 2
1

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 scalingBacklog 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 হওয়া requestLong 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)।