سه ابزار که همه جا اسمشان هست اما تفاوتهاشان را کمتر کسی میداند — مقایسه کامل با مثالهای واقعی
در هر کنفرانس فنی، در هر تیم backend، در هر مصاحبه شغلی — این سه اسم را میشنوید: Redis، RabbitMQ، Kafka. همه میدانند که میتوانند بعنوان «message broker» استفاده شوند. اما وقتی باید یکی یا دو یا هر سه را همراه با هم انتخاب کنید، سکوت میشود.
این مقاله را نوشتیم تا این سکوت را بشکنیم. نه با تعاریف خشک، بلکه با مثالهای واقعی، اعداد واقعی، و یک راهنمای ساده برای انتخاب درست.
Apache Kafka: 4.3.0 (منتشر ۲۲ مه ۲۰۲۶) — حذف کامل ZooKeeper
RabbitMQ: 4.0.x (پایدار)
Redis: 8.0.x (با Redis Streams بهبودیافته)
تصور کنید یک فروشگاه آنلاین دارید. کاربر سفارش میدهد — بلافاصله باید:
- ایمیل تأییدیه ارسال شود
- موجودی انبار کم شود
- پیامک به پیک فرستاده شود
- گزارش مالی آپدیت شود
اگر همه اینها را synchronous انجام دهید (یکی یکی و در همان request)، کاربر باید ۳ ثانیه منتظر بماند. و اگر یکی خطا دهد، کل تراکنش fail میشود.
Message Broker راهحل است: سفارش در یک صف (queue) گذاشته میشود، کاربر فوری پاسخ میگیرد، و سرویسهای مختلف هر کدام در زمان خودشان پیام را پردازش میکنند.
Redis یک in-memory data store است که pub/sub و Redis Streams را هم دارد. سرعتش از دو رقیب خود بیشتر است چون همه چیز در RAM است — اما این همان نقطه ضعفش هم هست: اگر سرور ریاستارت شود، پیامها از دست میروند مگر اینکه persistence را فعال کنید.
Redis Pub/Sub یک مدل fire-and-forget است — اگر consumer در لحظه انتشار پیام آنلاین نباشد، پیام را نمیبیند. Redis Streams این مشکل را حل کرد و پیامها را نگه میدارد.
✓ notification های realtime (chat، live update)
✓ cache invalidation بین سرویسها
✓ session sharing بین چند instance
✓ leaderboard و counter های real-time
✓ وقتی Redis را برای cache دارید و نمیخواهید سرویس جدید اضافه کنید
✓ پروژههای کوچک تا متوسط
✗ وقتی از دست رفتن پیام قابل قبول نیست (پرداخت، حسابداری)
✗ میلیونها پیام در ثانیه
✗ نیاز به replay پیامهای قدیمی
✗ پردازش توزیعشده پیچیده
RabbitMQ قدیمیترین و پختهترین گزینه است. در سال ۲۰۰۷ ساخته شده و با پروتکل AMQP کار میکند. مثل یک اداره پست هوشمند عمل میکند.
مهمترین ویژگی آن سیستم ACK (تأیید دریافت) است: وقتی consumer پیام را پردازش کرد، یک تأیید به RabbitMQ میفرستد. اگر consumer crash کند قبل از تأیید، RabbitMQ پیام را به consumer دیگری میدهد. هیچ پیامی گم نمیشود.
سیستم Exchange و Routing آن بسیار انعطافپذیر است — میتوانید بر اساس topic، pattern، یا fanout پیامها را route کنید.
✓ task queue — ارسال ایمیل، SMS، پردازش تصویر
✓ وقتی هر پیام باید دقیقاً یک بار پردازش شود
✓ workflow های پیچیده با routing مختلف
✓ یکپارچگی با Celery در پروژههای Python/Django
✓ پرداختها و تراکنشهای مالی
✓ پروژههای enterprise با SLA بالا
✗ throughput بالای ۱۰۰K پیام در ثانیه
✗ نیاز به replay پیامهای قدیمی (پیام پس از ACK حذف میشود)
✗ event streaming و تحلیل real-time
✗ وقتی چندین سرویس باید همان پیام را بخوانند (fan-out در مقیاس بزرگ)
Kafka در اصل یک event streaming platform است، نه صرفاً یک message broker. LinkedIn آن را برای پردازش روزانه بیلیونها event ساخت.
تفاوت اساسی Kafka با بقیه: پیامها بعد از خواندن حذف نمیشوند — در disk ذخیره میمانند (به صورت پیشفرض ۷ روز). این یعنی هر سرویسی میتواند مستقل پیامها را بخواند، و میتوانید به گذشته برگردید و پیامها را دوباره پردازش کنید.
Kafka 4.0 (ژانویه ۲۰۲۶) یک تغییر بنیادی داشت: ZooKeeper کاملاً حذف شد و KRaft جایگزین شد. Kafka 4.3.0 در ۲۲ مه ۲۰۲۶ منتشر شد.
✓ میلیونها event در ثانیه (click tracking، log aggregation)
✓ وقتی چندین سرویس باید همان event را بخوانند
✓ نیاز به replay — پردازش دوباره دادههای گذشته
✓ real-time analytics و data pipeline
✓ audit log — سابقه کامل همه تغییرات
✓ microservices در مقیاس بزرگ (Netflix، Uber، LinkedIn)
✗ پروژههای کوچک — overhead عملیاتی زیاد دارد
✗ وقتی به routing پیچیده نیاز دارید (RabbitMQ بهتر است)
✗ تیم کوچک بدون تجربه distributed systems
✗ نیاز به پاسخ فوری (request-reply pattern)
| معیار | Redis Pub/Sub | RabbitMQ | Kafka |
|---|---|---|---|
| سرعت | <1ms | 1-10ms | 5-100ms |
| throughput | ~1M msg/s | 50K-100K msg/s | 1M+ msg/s per broker |
| persistence | اختیاری (RAM) | بله (disk) | بله (disk، 7 روز) |
| از دست رفتن پیام | ممکن است | خیر (با ACK) | خیر |
| replay پیام | خیر | خیر | بله |
| مقیاسپذیری | vertical | محدود | horizontal بینهایت |
| پیچیدگی راهاندازی | خیلی ساده | متوسط | پیچیده |
| نیاز به RAM | کم | متوسط | زیاد |
| مناسب برای | realtime/cache | task queue | event streaming |
به جای جدول خشک، یک سری سوال بپرسید:
در PyCourse هم دقیقاً همین انتخابها را کردیم:
Redis برای: notification های realtime (WebSocket channel layer)، cache مقالات و داشبورد
Celery + Redis (به عنوان broker) برای: ارسال OTP، پردازش حذف پسزمینه تصویر
Kafka نداریم — چون با صد کاربر، Kafka overhead بیهودهای اضافه میکند. اگر به دههزار کاربر برسیم، RabbitMQ یا Kafka را بررسی میکنیم.
اگر در ۲۰۲۴ با Kafka کار کرده باشید، میدانید که راهاندازی آن به ZooKeeper نیاز داشت — یک سرویس جداگانه فقط برای مدیریت metadata. این دو سرویس را باید به صورت موازی نگه میداشتید.
Kafka 4.0 در ژانویه ۲۰۲۶ این مشکل را حل کرد: KRaft (Kafka Raft) جایگزین ZooKeeper شد. حالا Kafka خودش metadata خود را مدیریت میکند. راهاندازی و نگهداری بسیار سادهتر شد.
در پروژههای بزرگ اغلب هر سه با هم استفاده میشوند — هر کدام برای کاری که در آن بهترین است:
این معماری در شرکتهایی مثل Uber و Netflix واقعی است.
از Kafka قبل از اینکه واقعاً نیاز داشته باشید استفاده نکنید. بسیاری از تیمها Kafka را خیلی زود وارد میکنند و بیشتر وقتشان صرف نگهداری آن میشود تا ساختن محصول.— Martin Kleppmann · نویسنده Designing Data-Intensive Applications
| ابزار | یک جمله | بهترین کاربرد |
|---|---|---|
| Redis | سریعترین، سادهترین | notification، cache، session |
| RabbitMQ | قابلاعتمادترین | task queue، پرداخت، ایمیل |
| Kafka | قدرتمندترین | event streaming، analytics، log |
با سادهترین ابزار شروع کنید. Redis دارید؟ از Redis Streams استفاده کنید. وقتی به محدودیت رسیدید، به RabbitMQ بروید. وقتی به ۱۰۰K+ پیام در ثانیه رسیدید یا به replay نیاز داشتید، Kafka را بررسی کنید.