پیامها گم نمیشوند
RabbitMQ پیامها را تا وقتی مصرفکننده تأیید نکند نگه میدارد. با exchange های direct، topic و fanout میتوانید صف کار، pub/sub، مسیریابی بر اساس کلید و RPC بسازید.
برای Celery در Django، کارگرهای Node.js با amqplib یا سرویسهای Go با amqp091، فقط RABBITMQ_URL را بخوانید. پنل Management برای دیدن صفها و نرخ پیامها در دسترس است.
مناسب برای
- صف کارهای پسزمینه و Celery
- ارسال ایمیل و نوتیفیکیشن
- ارتباط ناهمگام میکروسرویسها
- RPC بین سرویسها
از ساخت تا اتصال
ساخت
broker با نسخهی پیشفرض 4 ساخته میشود.
--type rabbitmqلینک به اپ
RABBITMQ_URLبه تولیدکننده و مصرفکنندهها تزریق میشود.--prefix RABBITMQاستفاده
صفها و exchange ها از کد ساخته میشوند.
amqp://
خروجی ساخت سرویس
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 یا از کنسول.
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 });
import os
from celery import Celery
app = Celery("tasks", broker=os.environ["RABBITMQ_URL"])
خطاهای رایج
ACCESS_REFUSED
علتاطلاعات ورود اشتباه است یا vhost در رشتهی اتصال جا افتاده.
راهحلفقط از RABBITMQ_URL تزریقشده استفاده کنید.
NOT_FOUND - no queue
علتمصرفکننده قبل از تعریف صف به آن وصل شده است.
راهحلدر هر دو طرف صف را با assertQueue یا queue_declare تعریف کنید.
از سیستم خودم وصل نمیشوم
علتآدرس داخلی فقط از اپهای همان پروژه در دسترس است.
راهحلبرای اتصال از بیرون، دسترسی عمومی را روشن کنید و آدرس و پورت خارجی را از sakoocloud db credentials بگیرید.
sakoocloud db public-access <db-id>
sakoocloud db credentials <db-id>
پرسشهای متداول
RabbitMQ یا Kafka؟
برای صف کار و پیامهایی که یکبار مصرف میشوند RabbitMQ؛ برای جریان رویداد با حجم بالا و بازخوانی تاریخچه Kafka.
پنل Management در دسترس است؟
بله، روی پورت 15672 با همان نام کاربری و رمز.
پیامها بعد از ریاستارت میمانند؟
صفها و پیامهای durable روی دیسک نگهداری میشوند.
جزئیات بیشتر در راهنمای RabbitMQ در مستندات و مرجع CLI.