پرش به محتوای اصلی
آبیدرنت
کوردیشروع پروژه
بازگشت به آکادمی
مهندسی نرم‌افزار · ۷ دقیقه مطالعه

پردازش غیرهمگام در وب؛ راهنمای مدیریت صف‌های پیام با Celery و RabbitMQ

سوران منصوری
توسعه‌دهنده بک‌اند
پروفایل
معماری پردازش غیرهمگام و صف‌های پیام با Celery و RabbitMQ در استودیو آبیدرنت

اصول پیاده‌سازی صف‌های تسک در پروژه‌های وب؛ بررسی معماری پردازش غیرهمگام با ابزارهای RabbitMQ و Celery برای ارتقای توان سرور در آبیدرنت.

در توسعه سامانه‌های وب، یکی از پرتکرارترین دلایل افت کارایی سرور و بالا رفتن نرخ خروج کاربران، وادار کردن آن‌ها به «انتظار برای تکمیل عملیات‌های سنگین» است. اگر پروسه‌هایی نظیر صدور فاکتور PDF، ارسال پیامک احراز هویت، خروجی گرفتن از گزارش‌های مالی دیتابیس یا همگام‌سازی اطلاعات با وب‌سرویس‌های خارجی در همان چرخه مستقیم درخواست و پاسخ (Request/Response Cycle) انجام شوند، رشته‌های پردازشی وب‌سرور مسدود شده و با ورود چند کاربر هم‌زمان، کل سایت از دسترس خارج می‌شود. پیاده‌سازی معماری پردازش غیرهمگام از طریق صف‌های پیام، راهکار استاندارد برای حل این چالش است.

در این مقاله، ساختار صف‌های تسک و نحوه تفکیک وظایف سنگین بک‌اند بر پایه تجربیات عملیاتی آبیدرنت را بررسی می‌کنیم:

۱. مفهوم پردازش غیرهمگام و کارکرد Message Broker در الگوی ناهمگام، بک‌اند وظیفه سنگین را فوراً اجرا نمی‌کند؛ بلکه شناسنامه‌ای از تسک را به عنوان یک «پیام» در یک صف مطمئن ثبت کرده، شناسه پیگیری را در کسری از ثانیه به کلاینت تحویل می‌دهد و کاربر را معطل پایان کار نمی‌گذارد:

  • تولیدکننده پیام (Producer): وب‌سرور (مثلاً کدهای FastAPI، Django یا Node.js) که درخواست را از کاربر گرفته و کار را به صف ارسال می‌کند.
    • کارگزار پیام (Message Broker): میان‌افزاری مانند RabbitMQ یا Redis که پیام‌ها را به شکلی پایدار نگهداری و مدیریت می‌کند تا به ورکرها برساند.
      • کارگران پس‌زمینه (Workers): فرآیندهای مجزایی (مانند Celery Workers) که مستقل از وب‌سرور، پیام‌ها را از صف برداشته و در منابع اختصاصی خود پردازش می‌کنند.

        ۲. انتخاب ابزار صف پیام؛ Redis در برابر RabbitMQ بسته به نیازمندی سیستم، انتخاب میان این دو ابزار مسیر معماری را تعیین می‌کند:

        • استفاده از Redis: سریع، بسیار سبک و راه‌اندازی آسان در حافظه رم؛ انتخابی فوق‌العاده برای تسک‌های کوتاه‌مدت، کشینگ و ارسال نوتیفیکیشن‌هایی که حساسیت داده‌ای در حد تراکنش‌های بانکی ندارند.
          • استفاده از RabbitMQ: یک بروکر کامل با پشتیبانی از پروتکل AMQP، روتینگ پیچیده پیام‌ها و تضمین دریافت قطعی (Message Acknowledgement)؛ گزینه‌ای ضروری برای فرآیندهای مالی، پردازش‌های چندمرحله‌ای و سیستم‌های با حجم پیام میلیونی.

            ۳. اصول پایداری و تاب‌آوری در پردازش غیرهمگام اجرای اصولی صف‌های تسک در محیط پروداکشن نیازمند رعایت الزامات زیرساختی مشخصی است:

            • توانایی تکرارپذیری ایمن (Idempotency): اگر یک تسک به دلیل قطعی شبکه ری‌استارت شود و دو بار اجرا شود (مثلاً ارسال ایمیل یا اعمال تخفیف)، نباید خروجی مخرب یا تکراری تولید کند.
              • مدیریت شکست و صف پیام‌های مرده (Dead Letter Queue - DLQ): تسک‌هایی که پس از چند بار تلاش مجدد (Retries) با خطای بیزینسی مواجه می‌شوند، نباید صف اصلی را اشغال کنند؛ این تسک‌ها به یک صف اختصاصی خطا هدایت می‌شوند تا تیم فنی لاگ‌های آن‌ها را تحلیل کند.
                • جداسازی صف‌ها بر اساس اولویت: تفکیک صف‌های با اولویت آنی (مانند ارسال کد OTP لاگین) از صف‌های حجیم و کند (مانند بهینه‌سازی تصاویر سنگین یا پردازش لاگ‌ها) تا کندی یک بخش باعث تاخیر ورود کاربران نشود.

                  ۴. نظارت و مانیتورینگ بلادرنگ ورکرها در سامانه‌های عملیاتی، سلامت لایه پردازش غیرهمگام باید همواره رصد شود:

                  • بررسی نرخ انباشت پیام‌ها در صف (Queue Depth) برای تشخیص به‌موقع گلوگاه‌ها.
                    • فعال‌سازی ابزارهای مانیتورینگ توزیع‌شده مانند Flower یا اکسپورترهای Prometheus برای پایش میزان مصرف RAM و خطاهای کارگران پس‌زمینه.

                      جمع‌بندی مهندسی معماری مبتنی بر پردازش غیرهمگام به وب‌سایت‌ها و سامانه‌های ابری امکان می‌دهد با پاسخ‌دهی میلی‌ثانیه‌ای به کاربران، تجربه‌ای بدون تاخیر ارائه دهند و هم‌زمان سنگین‌ترین وظایف محاسباتی و داده‌ای را بدون نگرانی از افت پایداری سرور در لایه‌های پشتیبان مدیریت نمایند.

                      پردازش غیرهمگام، صف پیام RabbitMQ، فریم ورک Celery، مقیاس پذیری سرور، استودیو آبیدرنت