کارگزار پیام

RabbitMQ مدیریت‌شده برای صف و پیام‌رسانی

صف پیام قابل اطمینان برای جدا کردن سرویس‌ها و کارهای پس‌زمینه. AMQP استاندارد، با پنل مدیریت و تحویل تضمین‌شده‌ی پیام.

نسخه
RabbitMQ 4 (پیش‌فرض)
پروتکل
AMQP 0-9-1 روی 5672
پنل
Management روی 15672
در اپ
RABBITMQ_URL با --prefix RABBITMQ
لوگوی RabbitMQ

پیام‌ها گم نمی‌شوند

RabbitMQ پیام‌ها را تا وقتی مصرف‌کننده تأیید نکند نگه می‌دارد. با exchange های direct، topic و fanout می‌توانید صف کار، pub/sub، مسیریابی بر اساس کلید و RPC بسازید.

برای Celery در Django، کارگرهای Node.js با amqplib یا سرویس‌های Go با amqp091، فقط RABBITMQ_URL را بخوانید. پنل Management برای دیدن صف‌ها و نرخ پیام‌ها در دسترس است.

مناسب برای

  • صف کارهای پس‌زمینه و Celery
  • ارسال ایمیل و نوتیفیکیشن
  • ارتباط ناهمگام میکروسرویس‌ها
  • RPC بین سرویس‌ها

از ساخت تا اتصال

  1. ساخت

    broker با نسخه‌ی پیش‌فرض 4 ساخته می‌شود.

    --type rabbitmq
  2. لینک به اپ

    RABBITMQ_URL به تولیدکننده و مصرف‌کننده‌ها تزریق می‌شود.

    --prefix RABBITMQ
  3. استفاده

    صف‌ها و exchange ها از کد ساخته می‌شوند.

    amqp://

خروجی ساخت سرویس

sakoocloud db
sakoocloud db create --name broker --type rabbitmq
✔ Provisioning broker · db_4n8x2p
ℹ Ready in ~90s. Get credentials: sakoocloud db credentials db_4n8x2p
sakoocloud apps link-db db_4n8x2p --app my-api --prefix RABBITMQ
✔ Linked database. Env vars injected under RABBITMQ_*.
# RABBITMQ_URL=amqp://app:••••@…:5672

ساخت broker

با CLI یا از کنسول.

terminal
sakoocloud db create --name broker --type rabbitmq

تنظیمات

متغیرهایی که به اپ تزریق می‌شوند

پیشوند پیش‌فرض DATABASE است؛ با --prefix می‌توانید نام دیگری بدهید، مثلاً RABBITMQ.

متغیرمقدار
RABBITMQ_URLرشته‌ی کامل AMQP
RABBITMQ_HOST و RABBITMQ_PORTآدرس داخلی و پورت 5672

اتصال از اپ

تولیدکننده و مصرف‌کننده همان رشته را می‌خوانند.

import amqp from "amqplib";

const conn = await amqp.connect(process.env.RABBITMQ_URL);
const ch = await conn.createChannel();
await ch.assertQueue("emails", { durable: true });

رانتایم‌هایی که معمولاً به آن وصل می‌شوند

خطاهای رایج

ACCESS_REFUSED

علتاطلاعات ورود اشتباه است یا vhost در رشته‌ی اتصال جا افتاده.

راه‌حلفقط از RABBITMQ_URL تزریق‌شده استفاده کنید.

NOT_FOUND - no queue

علتمصرف‌کننده قبل از تعریف صف به آن وصل شده است.

راه‌حلدر هر دو طرف صف را با assertQueue یا queue_declare تعریف کنید.

از سیستم خودم وصل نمی‌شوم

علتآدرس داخلی فقط از اپ‌های همان پروژه در دسترس است.

راه‌حلبرای اتصال از بیرون، دسترسی عمومی را روشن کنید و آدرس و پورت خارجی را از sakoocloud db credentials بگیرید.

terminal
sakoocloud db public-access <db-id>
sakoocloud db credentials <db-id>

پرسش‌های متداول

RabbitMQ یا Kafka؟

برای صف کار و پیام‌هایی که یک‌بار مصرف می‌شوند RabbitMQ؛ برای جریان رویداد با حجم بالا و بازخوانی تاریخچه Kafka.

پنل Management در دسترس است؟

بله، روی پورت 15672 با همان نام کاربری و رمز.

پیام‌ها بعد از ری‌استارت می‌مانند؟

صف‌ها و پیام‌های durable روی دیسک نگهداری می‌شوند.

جزئیات بیشتر در راهنمای RabbitMQ در مستندات و مرجع CLI.

سریع‌ترین مسیر از کد تا انتشار.

ابتدا ابزار خط فرمان را نصب کنید، سپس همین‌جا امتحان کنید. (بنویسید، یا یکی از پیشنهادهای پایین ترمینال را بزنید)

~/projects/my-app
امتحان کنید