পাঠ্যক্রম খুলুন
মধ্যবর্তী পর্যায়

RabbitMQ: exchange, queue ও message routing

RabbitMQ Exchanges and Routing

এই পাঠের কুইজ ↓৫ মিনিট পড়াPHP 8.3+ · Laravel 12
এই পাঠের সূচিপত্র

এই পাঠে যা শিখবেন

  • Exchange queue ও binding আলাদা করুন
  • Routing key অনুযায়ী copy পৌঁছান
  • Publisher confirm এবং consumer ack বুঝুন

সমস্যা দিয়ে শুরু

Notification platform-এ payment event finance team ও customer email দুইদিকে যাবে, কিন্তু debug event শুধু audit-এ। একটি queue name দিয়ে সব route বর্ণনা কঠিন হয়ে গেছে। Producer যেন প্রতিটি consumer-এর physical queue জানে না, এমন routing দরকার।

সহজ করে বুঝি

RabbitMQ-তে producer exchange-এ publish করে। Binding ও exchange type দেখে message queue-তে route হয়। Direct exact routing key, topic pattern এবং fanout bindings-এ routing key উপেক্ষা করে fan-out করতে পারে। Queue message ধরে; exchange সাধারণ queue-এর মতো message backlog নয়।

পরিচিত একটি উপমা

ডাকঘরের sorting desk destination দেখে বস্তায় চিঠি রাখে। Sorting desk exchange, ঠিকানার নিয়ম binding, আর বস্তা queue। Mail carrier বস্তা থেকে নেয়। Desk-এ চিঠি পৌঁছানো আর প্রাপক পড়া আলাদা ঘটনা।

নকশাটি দেখুন

Diagram লোড হচ্ছে…

Exchange queue ও binding আলাদা করুন
Diagram-এর text flow দেখুন
flowchart LR
 P[Laravel Publisher] -->|order.paid| E[Topic Exchange]
 E -->|order.*| Q1[Finance Queue]
 E -->|order.paid| Q2[Receipt Queue]
 E -->|audit.#| Q3[Audit Queue]

order.paid routing key finance-এর order.* এবং receipt-এর exact binding match করে। audit.# match করে না, তাই audit queue এই event পায় না। Topic wildcard-এ star একটি word, hash শূন্য বা একাধিক word match করে। Unroutable message-এর handling configure করতে হয়।

PHP ও Laravel-এ প্রয়োগ

Laravel core-এ RabbitMQ queue driver default bundled নয়; compatible community adapter ও AMQP PHP client নিরীক্ষা করে install করতে হয়। নিচের PHP fragment queue driver API দাবি না করে routing specification তৈরি করে, যা infrastructure declaration ও contract test-এ ব্যবহারযোগ্য।

php
$topology = [
    'exchange' => 'domain.events',
    'type' => 'topic',
    'durable' => true,
    'bindings' => [
        ['queue' => 'finance', 'key' => 'order.*'],
        ['queue' => 'receipts', 'key' => 'order.paid'],
        ['queue' => 'audit', 'key' => 'audit.#'],
    ],
];
$event = [
    'id' => $eventId,
    'type' => 'order.paid',
    'data' => ['order_id' => $orderId],
];
$body = json_encode($event, JSON_THROW_ON_ERROR);
// Adapter must declare topology and handle confirms and returned messages.

এটি PHP 8.3+ ও Laravel 12-এর শিক্ষামূলক fragment; সম্পূর্ণ application নয়। সংশ্লিষ্ট route-এ authentication ও resource authorization প্রয়োগ করতে হবে। নিচের অনুশীলনে failure ইচ্ছা করে তৈরি করুন; শুধু সফল response দেখে correctness ধরে নেবেন না।

সুবিধা, সীমাবদ্ধতা ও trade-off

Rich routing ও worker task distribution RabbitMQ-এর শক্তি। Durable queue, message persistence ও publisher confirms মিলিয়ে data safety configure করতে হয়; একটি flag যথেষ্ট নয়। দীর্ঘ replayable event history চাইলে stream/log model-ও তুলনা করুন।

সাধারণ ভুল

  • Confirm এসেছে মানে consumer কাজ শেষ করেছে বলা।
  • Unroutable publish নীরবে সফল ধরে নেওয়া।
  • Retry immediate requeue করে poison message loop তৈরি করা।

আরও একটু গভীরে

Publisher confirm broker গ্রহণের boundary; consumer acknowledgment processing delivery-এর boundary। দুটো স্বাধীন। Prefetch outstanding unacked message সীমিত করে; বেশি prefetch throughput বাড়াতে পারে কিন্তু fairness এবং crash redelivery volume বদলায়।

Finance consumer বন্ধ রেখে publish করুন। Queue depth বাড়বে। Binding ইচ্ছাকৃত ভুল করে returned-message handling দেখুন। তারপর consumer effect-এর পরে ack-এর আগে বন্ধ করুন; redelivery-তে idempotent handler duplicate effect ঠেকাবে।

মনে রাখুন

  • Exchange route করে, queue ধরে।
  • Confirm ও ack ভিন্ন প্রতিশ্রুতি।
  • Unroutable ও poison message দৃশ্যমান রাখুন।

নিজে চেষ্টা করুন

order.created, order.paid ও inventory.low-এর জন্য topic binding table বানান। কোন queue কোন key পাবে হাতে যাচাই করুন।

নিজের বোঝা যাচাই করুন

1. Exchange backlog?

সাধারণ exchange routing করে; durable storage ও consumption queue-এর দায়িত্ব।

2. Topic star কী?

একটি dot-separated word match করে; hash শূন্য বা একাধিক word match করতে পারে।

3. Confirm মানে email গেছে?

না। Broker acceptance consumer business completion জানায় না।

4. Laravel native driver?

Default core connection হিসেবে ধরে নেবেন না; adapter compatibility এবং acknowledgment behavior যাচাই করতে হয়।

5. Prefetch কেন?

এক consumer-এর unacked workload সীমিত করে; memory, fairness ও throughput-এর trade-off নিয়ন্ত্রণ করে।

আরও পড়ুন

এই পাঠের কুইজ

এই পাঠ থেকে ২টি প্রশ্ন। উত্তর দিয়ে ব্যাখ্যা দেখুন; অধ্যায়ের কুইজ আলাদাভাবে দিতে হবে।

এই পাঠের ২টি প্রশ্নের উত্তর দিন। পাস করতে দুটিই সঠিক হতে হবে।

জমা দেওয়ার পর সঠিক উত্তর ও ব্যাখ্যা দেখবেন। ফলাফল এই ব্রাউজারে সংরক্ষিত থাকবে। অনুশীলনের ফল অধ্যায় সম্পন্নের হিসাবে যোগ হয় না।

সব বিষয় মিলিয়ে অনুশীলন করুন →

অগ্রগতি এই ব্রাউজারে সংরক্ষিত থাকে। শুধু পাঠ খুললে সম্পন্ন হয় না।