Course-এর সূচি

13.7

SQS বনাম SNS বনাম Kinesis, আর Amazon MQ

পাশাপাশি রেখে কোনটা নেবে তার গাইড, আর কখন standard protocol-এর broker-ই ঠিক উত্তর।

18 মিনিট পড়া + Animation

টিপস: ডটেড-আন্ডারলাইন করা যেকোনো শব্দে ট্যাপ বা Hover করলে তার অর্থ দেখবে।

এই লেসন শেষে তুমি পারবে

  • SQS, SNS আর Kinesis Data Streams পাশাপাশি রেখে তুলনা করতে: push নাকি pull, পড়ার পর message-এর কী হয়, data কতদিন থাকে, ক্রম, duplicate, কয়জন consumer, কে কীভাবে scale করে, আর replay।
  • কোনো scenario-র keyword দেখে ঠিক service (বা কয়েকটার জোড়া) বেছে নিতে: SQS FIFO, SNS + SQS fan-out, Kinesis + Data Firehose সহ, আর কখন উত্তর আসলে EventBridge বা Amazon MSK।
  • Event-driven AWS-এর “মূল তিনজন” Lambda, SNS আর SQS কীভাবে একসাথে কাজ করে, dead-letter queue আর fan-out pattern সহ বুঝিয়ে বলতে।
  • Amazon MQ কী, কোন কোন open protocol বোঝে (JMS, NMS, AMQP, STOMP, MQTT, OpenWire, WebSocket), আর কেন পুরোনো application নতুন করে না লিখে সরানোর বেলায় এটাই উত্তর, কিন্তু নতুন cloud-native app-এর বেলায় না, তা ব্যাখ্যা করতে।
  • Amazon MQ-কে highly available করে সাজাতে: দুটো AZ জুড়ে shared EFS storage সহ ActiveMQ active/standby, তিন node-এর RabbitMQ cluster, আর server-এ চলা একটা broker-এর সীমাবদ্ধতা।

#পুরো chapter এক পাতায়

এই লেসন দিয়ে decoupling chapter শেষ হচ্ছে। Lesson 13.1-এ তিনটা model-এর পরিচয় হয়েছিল; 13.2 থেকে 13.6 পর্যন্ত প্রতিটা service গভীরে দেখেছ। এখানে ওদের পাশাপাশি দাঁড় করাব, যাতে পরীক্ষার প্রশ্নে বা design review-তে কয়েক সেকেন্ডে বেছে নিতে পারো, আর কেন বেছেছ সেটা যুক্তি দিয়ে বলতে পারো।

তিনটা model একবার মনে করিয়ে দিই (lesson 13.1):

  • Queue (SQS): producer কাজ রেখে যায়; প্রতিটা message নেয় একজন consumer, কাজটা করে, তারপর delete করে।
  • Publish/subscribe (SNS): publisher একটা message পাঠায়; প্রত্যেক subscriber নিজের একটা copy পায়, সাথে সাথে push হয়ে।
  • Stream (Kinesis Data Streams): producer একটা log-এর শেষে record জুড়ে দেয়; অনেক consumer একই record পড়ে, প্রত্যেকে নিজের জায়গা থেকে, যতক্ষণ retention-এর সময় আছে।

Note-এ প্রতিটা service এক লাইনে বলা আছে:

  • Amazon SQS application-কে decouple করে। Consumer-রা queue থেকে message টেনে নেয় (pull), আর একজন consumer সফলভাবে process করলে message চিরতরে delete হয়ে যায়। Worker tier দিয়ে কাজ করাতে এটা ব্যবহার করো (video processing, email পাঠানো)।
  • Amazon SNS pub/sub model-এ কাজ করে, data সবার কাছে push করে দেয়। Standard topic কিছুই store করে না: পাঠানো হলেই message-এর গল্প শেষ। একটা event ঘটলে একসাথে অনেক service বা user-কে জানাতে হলে ব্যবহার করো (fan-out)।
  • Amazon Kinesis বিশাল পরিমাণ streaming data সামলায়। পড়ার পরও data delete হয় না (retention আছে), আর একাধিক consumer একই data বারবার পড়তে পারে। Big data নিয়ে কাজ করলে, আর একই stream থেকে real-time-এ নানা রকম analytics চালাতে হলে এটা।

একটা order event: queue-তে, topic-এ নাকি stream-এ

ঢাকার একটা food-delivery app একটা “order placed” event তৈরি করে। একই event SQS-এ, SNS-এ আর Kinesis Data Streams-এ গেলে কী হয়, আর কোনো consumer অনুপস্থিত থাকলে কে কী করে, পাশাপাশি দেখো।

পরিস্থিতি

Queue: consumer-রা টেনে নেয়, তাদের একজন message-টা process করে, তারপর delete করে।

Order service
SQS queueorders
Consumer A
Consumer B
send
ধাপ 1 / 4
1

Order service event-টা queue-তে পাঠিয়ে নিজের কাজে চলে যায়। কে process করবে, কখন করবে, তা সে জানেও না, তার মাথাব্যথাও না: এটাই decoupling।

#SQS বনাম SNS বনাম Kinesis পাশাপাশি

SQSSNSKinesis Data Streams
ModelQueue (point to point)Pub/sub topicStream (ক্রম মেনে চলা একটা log)
Data consumer-এর কাছে কীভাবে যায়Consumer টেনে নেয় (ReceiveMessage, long polling)SNS প্রত্যেক subscriber-কে push করেStandard consumer টেনে নেয় (প্রতি shard-এ 2 MB/s, সবার মধ্যে ভাগ); enhanced fan-out consumer-কে data push করা হয় (প্রতি shard-এ প্রত্যেক consumer-এর জন্য 2 MB/s)
Consumer পড়ার পরVisibility timeout ধরে লুকানো, তারপর consumer নিজে delete করেপরে পড়ার কিছু নেই: প্রত্যেক subscriber আগেই copy পেয়ে গেছেRetention শেষ না হওয়া পর্যন্ত record থেকে যায়
Data কতদিন থাকেDefault ৪ দিন, ১ মিনিট থেকে ১৪ দিনStandard topic: persist হয় না (retry-র পরও পৌঁছাতে না পারলে হারায়)Default ২৪ ঘণ্টা, সর্বোচ্চ ৩৬৫ দিন
Consumerযত খুশি worker, কিন্তু প্রতিযোগিতা করে: প্রতিটা message একজনের কাছেপ্রতি standard topic-এ সর্বোচ্চ ১,২৫,০০,০০০ subscription, প্রত্যেকে একটা copyঅনেক consumer, প্রত্যেকে সবকিছু পড়ে; প্রতি stream-এ সর্বোচ্চ ২০টা enhanced fan-out consumer
ক্রমশুধু FIFO queue-তে (message group ধরে)শুধু FIFO topic-এ (message group ধরে)প্রতি shard-এ (একই partition key-র record)
DuplicateStandard: at least once। FIFO: ৫ মিনিটের window-তে deduplicationStandard: at least once। FIFO: deduplicationAt least once: duplicate সামলাতে হবে consumer-কে
Capacity নিয়ে ভাবনানেই: standard queue-র throughput প্রায় সীমাহীননেই: প্রতি Region-এ publish-এর একটা soft quotaProvisioned mode-এ shard (প্রতি shard-এ ঢোকার পথে 1 MB/s বা ১,০০০ record/s), নয়তো নিজে নিজে scale করা on-demand mode
Replayনেই (DLQ থেকে redrive মানে replay না)নেই, শুধু archiving চালু থাকা FIFO topic ছাড়াআছে, retention-এর ভেতরের যেকোনো জায়গা থেকে
বাড়তি সুবিধাপ্রতি message-এ ১৫ মিনিট পর্যন্ত delay, DLQ, visibility timeoutFilter policy, অনেক রকম protocol (SQS, Lambda, Firehose, HTTP/S, email, SMS, mobile push)Lambda, KCL app, Data Firehose, Managed Service for Apache Flink-এর মতো consumer
Message sizeসর্বোচ্চ 1 MiB (Extended Client Library দিয়ে S3-এর মাধ্যমে 2 GB)Default 256 KiB, topic-এর setting দিয়ে 1 MiB পর্যন্তপ্রতি record-এ সর্বোচ্চ 10 MiB
কীসের জন্যWorker tier, buffer, হঠাৎ ভিড় সামলানোNotification, fan-outReal-time big data, analytics আর ETL

Table-টা কীভাবে পড়বে:

  • Push নাকি pull ঠিক করে দেয় কাকে তৈরি থাকতে হবে। SNS-এ subscriber-কে ঠিক তখনই পাওয়া যেতে হবে যখন SNS ডাকে; SQS আর standard Kinesis consumer-এ consumer নিজে তৈরি হলে চায়, তাই ধীর বা বন্ধ consumer শুধু কাজ জমায়।
  • পড়ার পর কী হয়, এটাই সবচেয়ে গভীর পার্থক্য। Queue হলো করণীয় কাজের তালিকা: হয়ে গেলে কাটা পড়ে। Topic হলো ঘোষণা: পরে খুঁজে দেখার কিছু নেই। Stream হলো recording: পড়লে কিছুই বদলায় না, আর যে কেউ পিছিয়ে যেতে পারে।
  • Capacity-র কারণে, সম্ভব হলে SQS আর SNS-ই ভালো: মাপজোখের কিছু নেই। Kinesis-এ তোমাকে provisioned shard বা on-demand mode বেছে নিতে হয় (lesson 13.5)।
  • ক্রম-এর দাম সব জায়গাতেই throughput: FIFO queue আর topic-এর message group-এর সীমা আছে (lesson 13.3), আর Kinesis ক্রম রাখে শুধু একটা shard-এর ভেতরে।

#ভুল ধারণা: “SNS কোনো data store করে না”

#Data Firehose আর Amazon MQ কোথায় বসে

ওপরের table-টা পরীক্ষার চিরচেনা ত্রিভুজ। এই chapter-এর বাকি দুটো service দুটো ফাঁক পূরণ করে:

ServiceModelData রাখে?Replay?Scalingকখন বেছে নেবে
SQSQueue, pull১৪ দিন পর্যন্ত, delete না হওয়া পর্যন্তনানিজে নিজেপ্রতি message-এ একজন worker, buffer
SNSPub/sub, pushনা (standard)না (শুধু FIFO archive)নিজে নিজেএকসাথে অনেককে জানানো, fan-out
Kinesis Data StreamsStream, pull বা push (enhanced fan-out)২৪ ঘণ্টা থেকে ৩৬৫ দিনহ্যাঁShard বা on-demandঅনেক পাঠক, real-time analytics, replay
Data FirehoseDelivery-র পাইপ, buffer করে তারপর লেখেনা (destination বন্ধ থাকলে অল্প সময়ের retry ছাড়া)নানিজে নিজেকোনো code ছাড়া streaming data S3, Redshift, OpenSearch, Splunk, HTTP endpoint-এ তোলা
Amazon MQQueue আর topic দুটো নিয়েই brokerহ্যাঁ, consume না হওয়া পর্যন্তনাBroker-এর মাপ তুমি ঠিক করোJMS, AMQP, STOMP, MQTT, OpenWire ব্যবহার করা চালু app

Firehose আছে lesson 13.6-এ; এর পরীক্ষার কৌশল হলো “প্রায় real time, code লাগে না, কোনো destination-এ তোলা”। Amazon MQ-এর জন্য নিচে আলাদা একটা অংশ আছে।

#বেছে নেওয়া: একটা সিদ্ধান্তের গাইড

  1. এটা কি এমন চালু application, যেটা standard কোনো messaging protocol-এ কথা বলে?

    App যদি ActiveMQ বা RabbitMQ-এর মতো broker-এর সাথে JMS, NMS, AMQP, STOMP, MQTT বা OpenWire ব্যবহার করে, আর messaging code নতুন করে না লিখে AWS-এ সরাতে হয়: Amazon MQ। না হলে পরের ধাপে যাও।

  2. প্রতিটা message একজন worker সামলাবে, নাকি সবাইকে দেখতে হবে?

    প্রতি message-এ একজন worker (job, task, process করার order): queue, SQS। Customer ধরে ক্রম বা ঠিক একবার process হওয়া জরুরি হলে: SQS FIFO। সবাইকে প্রতিটা message দেখতে হলে পরের ধাপে যাও।

  3. প্রত্যেক receiver-কে এখনই পেতে হবে, আর পরে কেউ পড়তে না পারলেও চলবে?

    মানুষ আর endpoint-কে notification (email, SMS, mobile push, HTTP webhook): SNS। Receiver যদি এমন system হয়, যেটা বন্ধ থাকার সময়েও একটা message হারাতে পারবে না: SNS + SQS fan-out, প্রতিটা receiver-এর জন্য একটা queue।

  4. কয়েকজন consumer-এর কি একই data নিজের গতিতে লাগবে, বা replay?

    বিশাল পরিমাণ event (clickstream, log, IoT reading, transaction), যেগুলো কয়েকটা স্বাধীন app পড়বে, real-time analytics, বা কোনো bug-এর পরে আবার process করা: Kinesis Data Streams। Stream-টা শুধু storage-এ তুলে দিতে হলে, কোনো code না লিখে: Data Firehose (সরাসরি, বা একটা Kinesis data stream থেকে পড়ে)।

  5. Event কি আসছে AWS service বা SaaS app থেকে, rule দিয়ে route হবে?

    “কোনো EC2 instance-এর অবস্থা বদলালে…”, “কেউ এই API call করলে…”, partner SaaS-এর event, content দেখে অনেক target-এ rule, নির্দিষ্ট সময়ের event: Amazon EventBridge (chapter 19, lesson 19.5)। আর team যদি আগে থেকেই Apache Kafka চালায়, তাহলে managed উত্তর হলো Amazon Managed Streaming for Apache Kafka (lesson 17.7)।

#Keyword-এর মানচিত্র

প্রশ্নে লেখা থাকে…উত্তর
decouple application tiers, asynchronous processing, worker tierSQS
buffer requests, tolerate traffic spikes, database-কে রক্ষা করাSQS
queue-র দৈর্ঘ্য দেখে worker scale করা (backlog per instance)SQS + Auto Scaling group
message ক্রম মেনে, exactly once, কোনো duplicate নাSQS FIFO (fan-out-এর জন্য SNS FIFO + SQS FIFO)
send notifications to thousands of users or endpoints simultaneously, email/SMS, push notificationSNS
one event triggers multiple independent workflows concurrently without data lossSNS + একাধিক SQS queue (fan-out)
কোনো subscriber শুধু কিছু message চায়SNS filter policy
একটা S3 event কয়েকজন consumer-এর কাছে যেতে হবেS3 → SNS → SQS queue (বা EventBridge)
multiple consumers read the same stream of IoT data at their own paceKinesis Data Streams
replay data, real-time big data, real-time custom analytics dashboardKinesis Data Streams
বিশাল পরিমাণে key ধরে ক্রম (user ধরে, device ধরে)Kinesis Data Streams (partition key)
archive clickstream to S3, Redshift বা OpenSearch-এ load, code ছাড়া, প্রায় real time, ParquetData Firehose
migrating existing / legacy applications, JMS / AMQP / MQTT-এর মতো standard protocol, without rewriting codeAmazon MQ
cloud-native নতুন applicationSQS / SNS, Amazon MQ না
troubleshoot failed messages, poison pill, prevent infinite processing loopsDead-letter queue (redrive policy)
AWS API call বা service event-এ rule দিয়ে সাড়া দেওয়াEventBridge

কারণ পড়ার আগে বাস্তব কিছু scenario-তে নিজে চেষ্টা করো:

কোন messaging service মানায়?

একটা scenario বেছে নাও, আন্দাজ করো, তারপর কারণটা পড়ো। Keyword-গুলো খেয়াল করো: একজন worker নাকি সবাই, push নাকি pull, ক্রম, replay, code ছাড়া, পুরোনো protocol।

১. একটা scenario বেছে নাও(প্রথমবারেই ঠিক: 0/10)

ঢাকার একটা online school lecture video upload করে। প্রতিটা video-কে একদল EC2 worker তিনটা resolution-এ convert করবে। প্রতিটা কাজ করবে একজন worker, আর কাজ জমলে বহরটা বড় হওয়া উচিত।

২. তোমার উত্তর

#মিলিয়ে বানানো pattern

বাস্তবের বেশিরভাগ system এই service-গুলোর একাধিক একসাথে ব্যবহার করে। নিচের চারটা pattern architecture-এ আর পরীক্ষার উত্তরে বারবার ফিরে আসে।

#SNS + SQS fan-out

একটা SNS topic-এ একবার publish করো, প্রতিটা consumer-এর জন্য একটা SQS queue subscribe করাও। SNS প্রতিটা queue-কে নিজের একটা copy দেয়; তারপর প্রতিটা queue তার consumer-কে দেয় buffer, retry, DLQ আর নিজের গতি। নতুন consumer মানে নতুন একটা queue, producer-এ কোনো বদল নেই। প্রতিটা queue-র access policy-তে topic-কে পাঠানোর অনুমতি দিতে হয়; অন্য account আর অন্য Region-এর subscription-ও চলে; subscription-এ filter policy দিলে ওই queue শুধু কিছু message পায়; আর SNS FIFO + SQS FIFO fan-out-এর পরেও ক্রম ধরে রাখে। এগুলো সব lesson 13.4-এ।

#SNS হয়ে S3 event

একটা S3 event notification (lesson 10.7) SQS, SNS বা Lambda-কে target করতে পারে, কিন্তু একটা prefix-এ একটা event type-এর গন্তব্য একটাই। একটা upload থেকে যখন কয়েকটা স্বাধীন কাজ শুরু করতে হয় (thumbnail, virus scan, indexing), তখন গন্তব্য হয় একটা SNS topic, যেটা কয়েকটা queue-তে ছড়িয়ে দেয়। বিকল্প হলো S3 event EventBridge-এ পাঠানো, যেটা অনেক target-এ route করতে পারে।

#Kinesis Data Streams + Data Firehose

একটা Kinesis data stream বিশাল পরিমাণ event একবার নেয়। Real-time consumer (Lambda, KCL দিয়ে বানানো একটা app, Managed Service for Apache Flink) এক সেকেন্ডের মধ্যে পড়ে dashboard আর alert-এর জন্য, আর Data Firehose একই stream পড়ে batch ধরে S3, Redshift বা OpenSearch-এ তুলে দেয়। Stream দেয় replay আর অনেক পাঠক; Firehose দেয় code ছাড়া storage (lesson 13.6)।

#Database-এর সামনে SQS

হঠাৎ ভিড়ের সময় queue ধাক্কাটা শুষে নেয়, আর worker (বা Lambda) লেখে database যতটা নিতে পারে সেই গতিতে। Producer দ্রুত থাকে, কিছু হারায় না, আর database কখনো traffic-এর দেয়াল দেখে না (lesson 13.1)।

মিলিয়ে বানানো pattern: fan-out, stream আর Firehose, S3 event

বাস্তবের system service-গুলো মিলিয়ে ব্যবহার করে। SNS copy করে, SQS জমিয়ে রাখে, Kinesis আবার পড়া যায় এমন log রাখে, Firehose সেটা storage-এ তুলে দেয়।

পরিস্থিতি

একবার publish; প্রতিটা queue পায় নিজের copy, চলে নিজের গতিতে।

Order service
SNS topic
Kitchen queue
SMS queue
Kitchen app
SMS sender
publish
ধাপ 1 / 3
1

Order service topic-এ একটা “order placed” message publish করে। কতগুলো team এটা চায়, তা সে জানে না।

#মূল তিনজন: Lambda, SNS আর SQS

Note এই তিনটাকে বলে AWS-এর event-driven architecture-এর ভিত্তি:

  • SQS একটা message queue, যেটা application-কে decouple করে। এটা pull-ভিত্তিক: consumer (একটা EC2 worker, বা Lambda) queue থেকে message টেনে নেয়।
  • SNS হলো pub/sub, আর push-ভিত্তিক: কোনো message publish হলেই প্রত্যেক subscriber (email, SMS, SQS, Lambda…) সাথে সাথে পেয়ে যায়।
  • Lambda হলো serverless compute: কোনো event ঘটলে (যেমন SQS-এ নতুন message, বা SNS থেকে notification) সে নিজে থেকেই তোমার code চালায়।

পরীক্ষা যে সংশোধনটা পছন্দ করে: SQS Lambda-কে push করে না। Lambda service একটা event source mapping চালায়, যেটা queue poll করে (long polling দিয়ে), তোমার function-কে একটা batch দেয়, আর function সফল হলে message-গুলো delete করে। SNS-এর বেলায় উল্টো: SNS নিজেই function-টা invoke করে। Lambda আর event source mapping-এর বিস্তারিত chapter 15-এ (lesson 15.1)।

#এক অনুচ্ছেদে dead-letter queue

SQS, SNS বা Lambda যখন একটা message বারবার process করতে ব্যর্থ হয় (সর্বোচ্চ retry ফুরিয়ে যায়), তখন message-টাকে একটা আলাদা queue-তে সরিয়ে দেওয়া হয়, যাতে সেটা হারিয়ে না যায় আর বাকিদের আটকে না রাখে: এটাই dead-letter queue (DLQ)। পরে developer-রা এটা দেখে debug করে। SQS-এ এটা সেট করতে হয় মূল queue-র redrive policy দিয়ে, যেখানে DLQ-এর নাম আর maxReceiveCount থাকে; একটা message delete না হয়ে ততবার receive হলেই SQS সেটা সরিয়ে দেয়। FIFO queue-র DLQ-ও FIFO হতে হবে, DLQ থাকতে হবে একই account আর Region-এ, আর এর retention মূল queue-র চেয়ে লম্বা রাখা উচিত। সমস্যা ঠিক করার পর message-গুলো আবার মূল queue-তে redrive করা যায়। SNS-এর বেলায় DLQ হলো প্রতিটা subscription-এ জুড়ে দেওয়া একটা SQS queue। বিস্তারিত আর retention-এর ফাঁদটা আছে lesson 13.2-এ।

#এক অনুচ্ছেদে fan-out pattern

একটা SNS topic, তাতে কয়েকটা SQS queue subscribe করা। Topic-এ একটা message publish হলে সেটা একসাথে সব queue-তে ছড়িয়ে পড়ে, ফলে একই message দিয়ে সমান্তরালে একদম আলাদা কাজ করানো যায়: এক queue-র worker order-টা database-এ save করে, আরেকটার worker email পাঠায়। পরীক্ষার বাক্য: “a single event needs to trigger multiple independent workflows concurrently without data loss” → SNS + একাধিক SQS।

মূল তিনজন: SQS টানে, SNS ঠেলে দেয়, Lambda code চালায়

ঢাকার একটা bKash-ধরনের payment service: payment event যায় SQS-এ process হতে, আর SNS-এ alert হতে। কে টানে, কে ঠেলে দেয়, আর একটা poison message শেষে কোথায় যায়, দেখো।

পরিস্থিতি

Lambda push-এর জন্য বসে থাকে না: Lambda service নিজেই তোমার হয়ে queue poll করে।

Payment API
Payments queue
Lambda
Dead-letter queue
send
ধাপ 1 / 3
1

Payment API প্রতিটা payment queue-তে পাঠিয়ে সাথে সাথে customer-কে উত্তর দেয়। ধীর কাজগুলো (ledger, receipt) পরে হয়: asynchronous।

#Amazon MQ

#SQS আর SNS থাকতে broker কেন

SQS আর SNS হলো cloud-native service, যাদের আছে AWS-এর নিজস্ব API: এদের ডাকতে হয় HTTPS-এ, AWS SDK বা CLI দিয়ে। বাকি industry যে open messaging protocol কয়েক দশক ধরে ব্যবহার করে আসছে, সেগুলো এরা বোঝে না।

অনেক company এখনো নিজেদের অফিসে এমন application চালায়, যেগুলো Apache ActiveMQ, RabbitMQ বা IBM MQ-এর মতো একটা message broker-এর সাথে standard protocol আর API দিয়ে কথা বলে: JMS, NMS, AMQP, STOMP, MQTT, OpenWire, WebSocket। এমন application-কে SQS বা SNS-এ নিতে হলে প্রতিটা send আর receive নতুন করে লিখতে হবে, acknowledgement, transaction, topic আর selector কীভাবে চলে তা বদলাতে হবে, তারপর সব আবার test করতে হবে।

Amazon MQ হলো Apache ActiveMQ আর RabbitMQ-এর জন্য একটা managed message broker service। Broker চালানোর ঝামেলা (provisioning, patch, backup, failover) AWS নেয়, আর সে ঠিক ওই protocol-গুলোই বোঝে, তাই application নিজের code রেখে দেয়, বদলায় শুধু connection string। এর থাকার পুরো কারণ এটাই: note-এর ভাষায়, “SQS/SNS-এর জন্য নতুন করে লেখার সময় বা বাজেট নেই”।

#Open protocol-গুলো

Protocol বা APIএটা কীসাধারণত কারা ব্যবহার করেAmazon MQ for ActiveMQ-এর endpoint
JMSJava-র standard messaging API (queue, topic, transaction)। Wire protocol না: নিচে ActiveMQ client সাধারণত OpenWire-এ কথা বলেEnterprise Java app, Spring, Java EE serverOpenWire দিয়ে
NMSJMS-এর .NET সংস্করণC# আর .NET appOpenWire দিয়ে
OpenWireActiveMQ-এর নিজস্ব wire protocolJava, .NET, C++-এর ActiveMQ clientssl://…:61617
AMQPBroker-এর জন্য open standard wire protocol (ActiveMQ-এ 1.0; RabbitMQ-এর মূল protocol 0-9-1)যেকোনো ভাষাamqp+ssl://…:5671
STOMPসহজ একটা text protocolPython, Ruby, PHP, JavaScript scriptstomp+ssl://…:61614
MQTTDevice-এর জন্য হালকা pub/sub protocolIoT device, sensormqtt+ssl://…:8883
WSS (WebSocket Secure)TLS-এর ওপর WebSocket, সাধারণত ভেতরে STOMP বা MQTTBrowser, web dashboardwss://…:61619

সব endpoint-ই TLS ব্যবহার করে। Amazon MQ for RabbitMQ বোঝে AMQP 0-9-1 (port 5671), আর ২০২৫-এর নভেম্বর থেকে Amazon MQ-তে RabbitMQ 4.2 native AMQP 1.0-ও যোগ করেছে; সাথে আছে RabbitMQ-এর web console। (পাশের কথা: RabbitMQ 4.2 চলে Graviton-এর mq.m7g instance-এ, আর replicated queue বলতে শুধু quorum queue; পরীক্ষা version নিয়ে মাথা ঘামায় না।)

#দুটো engine

Amazon MQ for ActiveMQAmazon MQ for RabbitMQ
EngineActiveMQ Classic (default 5.18)RabbitMQ 3.13 বা 4.2
ProtocolJMS/OpenWire, NMS, AMQP 1.0, STOMP, MQTT, WebSocketAMQP 0-9-1, AMQP 1.0 (4.2)
High availabilityদুটো AZ-এ active/standby জোড়া, shared EFS storage সহ; বা network of brokersতিনটা AZ-এ NLB-এর পেছনে তিন node-এর cluster, প্রতিটা node-এর নিজের EBS volume
সাধারণত কোথা থেকে আসেJava/JMS-ভিত্তিক system, নানা protocol মেশানো জায়গা, MQTT দিয়ে IoTআগে থেকেই RabbitMQ-এর জন্য লেখা app

দুটো engine-ই একই broker-এ queue (point to point, SQS-এর মতো) আর topic বা exchange (publish/subscribe, SNS-এর মতো) দেয়। প্রচলিত broker সবসময় এভাবেই কাজ করেছে, আর এজন্যই একটা Amazon MQ broker পুরোনো setup-এর দুটো অংশেরই জায়গা নিতে পারে।

একটা পুরোনো app AWS-এ যাচ্ছে: Amazon MQ, নাকি SQS-এর জন্য নতুন করে লেখা?

একটা garments রপ্তানিকারকের Java order system অফিসের ActiveMQ broker-এর সাথে JMS দিয়ে কথা বলে। Team এটাকে EC2-তে সরাচ্ছে, কিন্তু messaging code নতুন করে লেখার সময় নেই।

পরিস্থিতি

একই protocol, একই code: শুধু broker-এর address বদলায়।

পুরোনো appJMS / OpenWire
Amazon MQActiveMQ
Amazon SQSHTTPS API
Warehouse appSTOMP
একটা URL বদল
ধাপ 1 / 4
1

একমাত্র বদল connection string-এ: পুরোনো broker-এর address-এর জায়গায় বসে Amazon MQ-এর endpoint, failover list হিসেবে লেখা।

#এটা server-এ চলে

Amazon MQ managed, কিন্তু serverless না:

  • তুমি একটা broker instance type বেছে নাও (যেমন test-এর জন্য mq.t3.micro, mq.m5.large আর তার চেয়ে বড়, বা Graviton-এর mq.m7g পরিবার) আর একটা deployment mode। টাকা দিতে হয় প্রতি broker-ঘণ্টা আর প্রতি GB-মাস storage ধরে, message চলুক বা না চলুক।
  • একটা broker-এর সীমা বাঁধা: বড় instance type-এ ActiveMQ প্রতি wire-level protocol-এ ২,০০০ connection নেয় (micro-তে ৩০০), mq.m5 broker-এ storage 200 GB, আর default-এ প্রতি Region-এ ২০০টা broker।
  • বেশি load সামলাতে বড় instance type-এ যেতে হয় (reboot দিয়ে বসে, active/standby-তে যেটা একটা ছোট্ট failover), বা একটা network of brokers বানাতে হয়। SQS আর SNS যেভাবে “scale” করে, এটা সেভাবে করে না, slide-এ এটা সরাসরিই বলা।
  • Broker থাকে তোমার VPC-র subnet-এ, security group সহ। এটা private হতে পারে (অফিস থেকে VPN বা Direct Connect দিয়ে পৌঁছানো), বা public-ও করা যায়। Message at rest encrypt হয় KMS দিয়ে আর in transit TLS দিয়ে; ActiveMQ-এর user-রা username আর password দিয়ে, বা LDAP দিয়ে authenticate করে।

#High availability

Slide-এ ActiveMQ-এর ছবিটা এরকম: একটা AZ-এ একটা active broker, একই Region-এর আরেকটা AZ-এ একটা standby broker, দুজনেই storage হিসেবে Amazon EFS-এর সাথে যুক্ত, আর client একটা থেকে আরেকটায় failover করে।

  • Single-instance (ActiveMQ বা RabbitMQ): একটা AZ-এ একটা broker, storage EBS-এ (ActiveMQ-এ চাইলে EFS)। সস্তা, development-এর জন্য ঠিক আছে; AZ বা broker বিকল হলে AWS ঠিক না করা পর্যন্ত broker পাওয়া যায় না।
  • Active/standby (ActiveMQ): দুটো AZ-এ দুটো broker একটা redundant জোড়া হিসেবে, একটাই message store শেয়ার করে Amazon EFS-এ, যেটা data একাধিক AZ জুড়ে redundant রাখে। Active থাকে একটাই। সেটা বিকল হলে, বা সাপ্তাহিক maintenance window-তে, Amazon MQ standby-কে active করে, সে একই store খোলে, তাই persist হওয়া message হারায় না; reboot-এর failover-এ লাগে মাত্র কয়েক সেকেন্ড। প্রতিটা protocol-এর দুটো endpoint (-1 আর -2), আর client-কে দুটো দিয়েই failover transport ব্যবহার করতে হয়, যেমন failover:(ssl://b-…-1.mq…:61617,ssl://b-…-2.mq…:61617)।
  • Cluster (RabbitMQ): একটা Network Load Balancer-এর পেছনে তিনটা AZ-এ তিনটা node, user, queue আর state শেয়ার করে; message node-গুলোর মধ্যে replicate হয়। Maintenance হয় একবারে একটা node ধরে, আর client-কে নিজে নিজে আবার connect করতে জানতে হয়।
  • Network of brokers (ActiveMQ): কয়েকটা broker (প্রতিটা single বা active/standby) একসাথে জোড়া, scale-এর জন্য বা আলাদা জায়গার জন্য।

Amazon MQ high availability: shared EFS storage সহ active/standby

দুটো Availability Zone-এ একজোড়া ActiveMQ broker। Active থাকে একটাই; দুজনেই Amazon EFS-এর একই message store ব্যবহার করে। একটা failure, একটা maintenance reboot আর single-instance-এর ঘটনা দেখো।

পরিস্থিতি

একটা active broker, একটা standby, একটা shared store।

ap-southeast-1
AZ a
AZ b
Client appfailover://
Broker 1active
Broker 2standby
EFS storemulti-AZ
send
ধাপ 1 / 3
1

Client দুটো endpoint (-1 আর -2) দিয়ে failover transport ব্যবহার করে। যেটা active, সেটায় connect করে; standby কোনো connection নেয় না।

#Amazon MQ বনাম SQS আর SNS

SQS / SNSAmazon MQ
API আর protocolHTTPS-এ AWS-এর নিজস্ব API (SDK, CLI)Open standard: JMS, NMS, AMQP, STOMP, MQTT, OpenWire, WebSocket
InfrastructureServerless, মাপজোখের কিছু নেইতোমার বেছে নেওয়া broker instance, তোমার VPC-তে
Scalingনিজে নিজে, প্রায় সীমাহীনInstance type-এর সীমায় বাঁধা; বড় করো বা broker যোগ করো
Availabilityএকাধিক AZ জুড়ে আগে থেকেইতুমি বেছে নাও: single instance, active/standby, বা cluster
Queue আর topicআলাদা service (SQS queue, SNS topic)একই broker-এ দুটোই
খরচের ধরনপ্রতি request (আর প্রতি delivery) ধরেপ্রতি broker-ঘণ্টা আর storage ধরে
সুবিধাDLQ, FIFO, filter policy, Lambda আর S3-এর সাথে integrationBroker-এর সুবিধা: transaction, message selector, নির্দিষ্ট সময়ে delivery, JMS-এর নিয়মকানুন
কীসের জন্য সেরানতুন, cloud-native applicationচালু application নতুন করে না লিখে সরানো

#কোথায় গোলমাল হয়

লক্ষণসম্ভাব্য কারণসমাধান
দ্বিতীয় একটা team একই SQS queue-তে consumer বানাল, এখন প্রত্যেক team কিছু কিছু order দেখছেQueue প্রতিটা message দেয় একজন consumer-কেFan-out: প্রতিটা team-এর জন্য একটা queue সহ SNS topic, বা replay লাগলে Kinesis stream
দুই ঘণ্টার বিভ্রাটে একটা webhook subscriber notification হারালSNS standard topic জমা রাখে না; retry ফুরিয়ে গেছেওই subscriber-এর সামনে একটা SQS queue বসাও, নিদেনপক্ষে একটা subscription DLQ
একটা bug-এর পর analytics গত সপ্তাহের event আবার process করতে চায়, কিন্তু সেগুলো এসেছিল SQS দিয়েProcess হওয়া SQS message delete হয়ে যায়; replay নেইযে data-র replay লাগতে পারে, তার জন্য Kinesis Data Streams (৩৬৫ দিন পর্যন্ত retention), বা Firehose দিয়ে S3-এ archive
Kinesis producer পাচ্ছে ProvisionedThroughputExceededExceptionকোনো shard 1 MB/s বা ১,০০০ record/s ছাড়িয়েছে, প্রায়ই একটা hot partition keyভালো partition key, আরও shard, বা on-demand mode (lesson 13.5)
একই stream-এর দুটো analytics app ধীর, read-এ throttle হচ্ছেStandard consumer প্রতি shard-এর 2 MB/s ভাগাভাগি করেEnhanced fan-out প্রত্যেক consumer-কে প্রতি shard-এ নিজের 2 MB/s দেয়
একটা message বারবার ফিরে আসছে, দিনের পর দিন একটা worker আটকে রাখছেPoison message, অথচ redrive policy নেইmaxReceiveCount সহ DLQ; DLQ-এর গভীরতায় alarm
একটা FIFO workload সেকেন্ডে ৩০০ message-এ আটকে গেছেBatch নেই, high throughput mode নেই, বা একটাই message group১০টা পর্যন্ত batch, high throughput চালু, message group ছড়িয়ে দাও
AWS-এ সরানো একটা পুরোনো app SQS-এ connect করতে পারছে নাSQS-এর কোনো AMQP/OpenWire/STOMP endpoint নেইAmazon MQ, নয়তো AWS SDK-এর জন্য নতুন করে লেখো
প্রতিটা Amazon MQ maintenance window-তে client ভেঙে পড়েClient একটা endpoint ব্যবহার করে, failover transport নাদুটো endpoint দিয়ে failover transport, সাথে আবার connect করার logic
ভিড়ের সময় Amazon MQ broker producer-দের ধীর করে দেয়Broker-এর memory বা storage ভরা; flow control চালু হয়েছেবড় instance type, আরও consumer, ছোট queue, বা network of brokers
Amazon MQ failover-এর পর কিছু order দুবার process হলোDeliver হয়েছে কিন্তু acknowledge হয়নি এমন message আবার আসেIdempotent consumer (process হওয়া ID জমা রাখো)
একটা single-instance broker তার AZ-এর সাথে বন্ধ হয়ে গেলSingle-instance mode-এ standby নেইProduction-এ active/standby (ActiveMQ) বা cluster (RabbitMQ)

#System design-এ messaging

  • নতুন service-এ প্রথম পছন্দ SQS আর SNS: capacity নিয়ে ভাবনা নেই, যত ব্যবহার তত খরচ, আর integration-গুলো (Lambda, S3 event, ASG scaling, lesson 9.4-এর Beanstalk worker environment) আগে থেকেই আছে।
  • প্রতি consumer-এ একটা queue, প্রতি event type-এ একটা topic। Domain event (“order placed”, “payment received”) SNS topic-এ publish করো, আর প্রতিটা consuming service-কে দাও নিজের SQS queue, নিজের DLQ সহ। তাহলে service-গুলো আলাদাভাবে deploy, scale আর নষ্টও হতে পারে।
  • Data-র জন্য Kinesis, কাজের জন্য SQS। যে event কয়েকটা team বিশ্লেষণ করে, বা যেটা আবার চালাতে হতে পারে, সেটা যাবে stream-এ; যে কাজ একবারই করতে হবে, সেটা queue-তে। অনেক system-এ দুটোই থাকে, একই producer থেকে।
  • Data lake-এর জন্য stream-এর শেষে Firehose, আর real-time ফলের জন্য Managed Service for Apache Flink বা Lambda (chapter 17)।
  • সেতু হিসেবে Amazon MQ। Migration-এর deadline ধরতে পুরোনো app-কে Amazon MQ-তে তুলে বসাও, তারপর নতুন consumer বানাও SQS/SNS-এ, আর পুরোনো app অবসরে গেলে broker-টাও বন্ধ করো। AWS-এর migration pattern chapter 23-এ (server migration)।
  • সব জায়গায় idempotency। Standard SQS, SNS, Kinesis আর broker-এর failover, সবাই একটা message একাধিকবার দিতে পারে; consumer-কে এমন হতে হবে যাতে দুবার চললেও ক্ষতি না হয়।
  • জমা কাজের দিকে চোখ রাখো। Queue-র জন্য ApproximateNumberOfMessagesVisible, stream-এর জন্য GetRecords.IteratorAgeMilliseconds, আর প্রতিটা queue-র DLQ-এর গভীরতা: customer টের পাওয়ার আগেই এগুলো বলে দেয় কোনো consumer পিছিয়ে পড়ছে (CloudWatch, chapter 19)।
  • পুরো account জুড়ে event: উৎস যখন AWS নিজেই (instance-এর অবস্থা বদল, CloudTrail-এ লেখা কোনো API call) বা কোনো SaaS partner, তখন EventBridge; event-processing-এর architecture-গুলো একসাথে আছে lesson 24.1-এ।

#নিজে করে দেখো

একই “order placed” event প্রতিটা service দিয়ে। Account 111122223333, Region ap-southeast-1; output ছোট করে দেখানো।

# 1. SQS: send, receive, delete (একজন consumer নিয়ে যায়)
aws sqs create-queue --queue-name orders-example
#   "QueueUrl": "https://sqs.ap-southeast-1.amazonaws.com/111122223333/orders-example"
Q=https://sqs.ap-southeast-1.amazonaws.com/111122223333/orders-example
aws sqs send-message --queue-url $Q --message-body '{"orderId":"A-1001","area":"Dhanmondi"}'
aws sqs receive-message --queue-url $Q --wait-time-seconds 20 --max-number-of-messages 10
#   "Messages": [{ "MessageId": "5fea7756-…", "ReceiptHandle": "AQEB…", "Body": "{\"orderId\":\"A-1001\",…}" }]
aws sqs delete-message --queue-url $Q --receipt-handle "AQEB…"
aws sqs receive-message --queue-url $Q --wait-time-seconds 5     # কিছুই নেই: চলে গেছে

# 2. SNS: একবার publish, প্রত্যেক subscriber একটা copy পায় (ওপরের queue-তে fan-out)
aws sns create-topic --name order-events-example
#   "TopicArn": "arn:aws:sns:ap-southeast-1:111122223333:order-events-example"
aws sns subscribe --topic-arn arn:aws:sns:ap-southeast-1:111122223333:order-events-example \
  --protocol sqs --notification-endpoint arn:aws:sqs:ap-southeast-1:111122223333:orders-example
aws sns subscribe --topic-arn arn:aws:sns:ap-southeast-1:111122223333:order-events-example \
  --protocol email --notification-endpoint ops@example.com
aws sns publish --topic-arn arn:aws:sns:ap-southeast-1:111122223333:order-events-example \
  --message '{"orderId":"A-1002"}'
#   "MessageId": "a1b2c3d4-…"   (queue-র access policy-তে এই topic-কে পাঠানোর অনুমতি লাগবে)

# 3. Kinesis: একটা record রাখো, দুবার পড়ো, একটা সময় থেকে replay
aws kinesis create-stream --stream-name order-stream-example --stream-mode-details StreamMode=ON_DEMAND
aws kinesis put-record --stream-name order-stream-example --partition-key Dhanmondi \
  --data '{"orderId":"A-1003"}' --cli-binary-format raw-in-base64-out
#   "ShardId": "shardId-000000000002", "SequenceNumber": "49654…"
IT=$(aws kinesis get-shard-iterator --stream-name order-stream-example --shard-id shardId-000000000002 \
  --shard-iterator-type AT_TIMESTAMP --timestamp 2026-10-26T09:00:00Z --query ShardIterator --output text)
aws kinesis get-records --shard-iterator $IT      # record এখনো আছে, যতবার খুশি

# 4. Amazon MQ: দুটো subnet-এ (দুটো AZ) একটা ActiveMQ active/standby broker, EFS storage
aws mq create-broker --broker-name orders-mq-example --engine-type ACTIVEMQ --engine-version 5.18 \
  --deployment-mode ACTIVE_STANDBY_MULTI_AZ --host-instance-type mq.m5.large --storage-type EFS \
  --no-publicly-accessible --auto-minor-version-upgrade \
  --subnet-ids subnet-0aaa1111example subnet-0bbb2222example --security-groups sg-0ccc3333example \
  --users Username=orders-admin,Password='use-a-long-secret-here',ConsoleAccess=true
#   "BrokerId": "b-1234abcd-56ef-78ab-90cd-1234567890ab"
aws mq describe-broker --broker-id b-1234abcd-56ef-78ab-90cd-1234567890ab \
  --query 'BrokerInstances[].Endpoints'
#   [ ["ssl://b-1234abcd-…-1.mq.ap-southeast-1.amazonaws.com:61617",
#      "amqp+ssl://b-1234abcd-…-1.mq.ap-southeast-1.amazonaws.com:5671",
#      "stomp+ssl://b-1234abcd-…-1.mq.ap-southeast-1.amazonaws.com:61614",
#      "mqtt+ssl://b-1234abcd-…-1.mq.ap-southeast-1.amazonaws.com:8883",
#      "wss://b-1234abcd-…-1.mq.ap-southeast-1.amazonaws.com:61619"],
#     ["ssl://b-1234abcd-…-2.mq.ap-southeast-1.amazonaws.com:61617", … ] ]
aws mq reboot-broker --broker-id b-1234abcd-56ef-78ab-90cd-1234567890ab   # client-এর failover দেখো

# 5. পরিষ্কার করো (broker অলস থাকলেও প্রতি ঘণ্টায় টাকা কাটে)
aws mq delete-broker --broker-id b-1234abcd-56ef-78ab-90cd-1234567890ab
aws kinesis delete-stream --stream-name order-stream-example
aws sns delete-topic --topic-arn arn:aws:sns:ap-southeast-1:111122223333:order-events-example
aws sqs delete-queue --queue-url $Q

পুরোনো app শুধু তার broker URL বদলে দুটো ssl:// endpoint-এর failover রূপ বসায়। ধাপ ৪-এর পার্থক্যটা খেয়াল করো: তোমাকে instance type, দুটো subnet আর একটা deployment mode বেছে নিতে হলো, যেগুলোর কোনোটাই SQS বা SNS কখনো জানতে চায়নি।

#সারসংক্ষেপ

মূল কথা

  • SQS = queue, pull, প্রতি message-এ একজন consumer, process হলে delete, থাকে ১৪ দিন পর্যন্ত, capacity নিয়ে ভাবনা নেই, ক্রম শুধু FIFO-তে, প্রতি message-এ delay। Worker tier আর buffer।
  • SNS = pub/sub, প্রতি topic-এ ১,২৫,০০,০০০ subscription পর্যন্ত push, standard topic কিছুই রাখে না (retry, subscription DLQ, FIFO archive আর replay হলো ব্যতিক্রম), ১,০০,০০০ topic পর্যন্ত, capacity নিয়ে ভাবনা নেই, ক্রমের জন্য FIFO topic। Notification আর fan-out।
  • Kinesis Data Streams = stream, standard consumer টেনে নেয় (প্রতি shard-এ 2 MB/s ভাগাভাগি), enhanced fan-out push করে (প্রতি shard-এ প্রত্যেক consumer-এর 2 MB/s), record থেকে যায় ২৪ ঘণ্টা থেকে ৩৬৫ দিন, replay, ক্রম প্রতি shard-এ, provisioned বা on-demand। Real-time big data, analytics, ETL।
  • Data Firehose stream-কে S3, Redshift, OpenSearch আর আরও জায়গায় তোলে, প্রায় real time, code ছাড়া, replay নেই। EventBridge AWS আর SaaS-এর event rule দিয়ে route করে (lesson 19.5); Amazon MSK হলো managed Kafka (lesson 17.7)।
  • Pattern: SNS + SQS fan-out (একটা event, অনেক স্বাধীন workflow, কিছু হারায় না), S3 → SNS → SQS, Kinesis + Firehose, database-এর সামনে SQS।
  • মূল তিনজন: SQS টানে, SNS ঠেলে দেয়, Lambda code চালায় (event source mapping দিয়ে Lambda SQS poll করে)। Poison message-এর জন্য redrive policy দিয়ে DLQ।
  • Amazon MQ = managed ActiveMQ / RabbitMQ broker, বোঝে JMS, NMS, AMQP, STOMP, MQTT, OpenWire, WSS: চালু app নতুন করে না লিখে সরানোর উত্তর, নতুন cloud-native app-এর না। এতে queue আর topic দুটোই আছে, চলে broker instance-এ, SQS/SNS-এর মতো scale করে না।
  • Amazon MQ HA: ActiveMQ-এ দুটো AZ-এ shared EFS storage সহ active/standby, সাথে failover transport; RabbitMQ-এ তিনটা AZ জুড়ে তিন node-এর cluster; single-instance-এ failover নেই।