از Hangfire تا RabbitMQ: پایان دادن به Polling پایگاه داده

Hangfire برای تیم‌های کوچک عالی است. کافی است یک بسته NuGet اضافه کنید و آن را به پایگاه داده خود متصل کنید. شما یک اجراکننده وظیفه (job runner) و یک داشبورد رایگان دریافت می‌کنید. برای یک سرویس واحد، جایگزین سختی برای آن پیدا نمی‌شود.

من از Hangfire در SavePosty برای مدیریت ایمیل‌ها، وب‌هوک‌ها و دریافت محتوا استفاده می‌کردم. تمام jobها به یک شکل عمل می‌کردند. همه آن‌ها هر چند ثانیه یک‌بار پایگاه داده Postgres من را برای بررسی کارهای جدید Polling می‌کردند.

در نهایت همه چیز را به RabbitMQ منتقل کردم. در اینجا دلیل این کار و آنچه از دست دادم را توضیح می‌دهم.

چرا انتقال دادم:

  • بار Polling با زمان مقیاس‌پذیر می‌شود، نه با حجم کار. هر job در Hangfire بر اساس یک تایمر به پایگاه داده شما درخواست می‌فرستد. حتی اگر کاری برای انجام دادن نباشد، پایگاه داده مشغول باقی می‌ماند. این هزینه با افزایش تعداد jobها و فرکانس Polling رشد می‌کند.
  • مدل‌های بیش از حد زیاد. بخشی از اپلیکیشن من از قبل از RabbitMQ استفاده می‌کرد و بقیه از Hangfire. این یعنی دو روش متفاوت برای مدیریت کارهای پس‌زمینه. انتقال به RabbitMQ همه چیز را یکپارچه کرد.
  • تأخیر (Latency). یک broker به محض رسیدن کار، آن را Push می‌کند. Hangfire منتظر Polling بعدی می‌ماند.

مزایا و معایب:

راه‌اندازی Hangfire آسان است. این ابزار از جداول SQL موجود شما استفاده می‌کند و یک داشبورد داخلی عالی دارد.

RabbitMQ مستلزم مدیریت یک broker است. این ابزار به جای CPU پایگاه داده، از RAM و شبکه استفاده می‌کند. شما مقیاس‌پذیری بهتری خواهید داشت، اما هزینه‌های عملیاتی (operational overhead) بیشتری هم خواهید داشت.

چگونه با امنیت کامل مهاجرت کردم:

من منطق تجاری (business logic) خود را دقیقاً همان‌طور که بود نگه داشتم. من Consumerهای سبکی ساختم که مانند یک درِ ورودی عمل می‌کنند. Consumer پیام را دریافت کرده و آن را به کلاس job موجود تحویل می‌دهد.

من روی دو مورد تمرکز کردم:

  • برابری در Retry. تنظیمات Retry در Hangfire را با Consumer در RabbitMQ مطابقت دادم تا پیام‌ها را از دست ندهم.
  • امنیت Schema. ستون‌های قدیمی را Nullable نگه داشتم تا در حین استقرار (deploy)، پایگاه داده دچار مشکل نشود.

آنچه از دست دادم:

بزرگترین نقطه ضعف، قابلیت مشاهده (visibility) است. Hangfire به شما اجازه می‌دهد روی یک job شکست‌خورده کلیک کنید و دقیقاً ببینید چه اتفاقی افتاده است. RabbitMQ به شما نشان می‌دهد که چند پیام در Dead Letter Queue وجود دارد، اما همان نمای آسانِ «به ازای هر job» را به شما نمی‌دهد. من اکنون به جای داشبورد، به لاگ‌های ساختاریافته (structured logs) متکی هستم.

توصیه من:

در Hangfire بمانید اگر:

  • یک سرویس واحد را اجرا می‌کنید.
  • تیم کوچکی دارید.
  • برای عیب‌یابی (debugging) به یک داشبورد آسان نیاز دارید.

به RabbitMQ مهاجرت کنید اگر:

  • چندین سرویس دارید.
  • بار پایگاه داده ناشی از Polling بالا است.
  • می‌خواهید از الگوهای pub/sub استفاده کنید.

تصمیم‌گیری به سیستم شما بستگی دارد، نه به یک job واحد.

Source: https://dev.to/gabrielleroux/from-hangfire-to-rabbitmq-killing-database-polling-in-a-net-app-4og4

Optional learning community: https://t.me/GyaanSetuAi