Hangfire سے RabbitMQ تک: ڈیٹا بیس پولنگ (Database Polling) کا خاتمہ

Hangfire چھوٹی ٹیموں کے لیے بہترین ہے۔ آپ ایک NuGet پیکیج شامل کرتے ہیں اور اسے اپنے ڈیٹا بیس کی طرف اشارہ کرتے ہیں۔ آپ کو مفت میں ایک job runner اور ڈیش بورڈ مل جاتا ہے۔ ایک سروس کے لیے، اس کا مقابلہ کرنا مشکل ہے۔

میں نے SavePosty میں ای میلز، webhooks، اور مواد حاصل کرنے (content fetching) کے لیے Hangfire کا استعمال کیا۔ ہر job ایک ہی طریقے سے کام کرتی تھی۔ وہ سب نئے کام کی جانچ کے لیے ہر چند سیکنڈ بعد میرے Postgres ڈیٹا بیس کو پول (poll) کرتے تھے۔

میں نے آخر کار سب کچھ RabbitMQ پر منتقل کر دیا۔ یہاں وجہ بتائی گئی ہے کہ میں نے ایسا کیوں کیا اور میں نے کیا کھویا۔

میں نے کیوں منتقل کیا:

  • پولنگ کا بوجھ وقت کے ساتھ بڑھتا ہے، کام کے ساتھ نہیں۔ ہر Hangfire job ایک ٹائمر پر آپ کے ڈیٹا بیس کو ہٹ (hit) کرتی ہے۔ اگر کوئی کام نہ بھی ہو، تب بھی ڈیٹا بیس مصروف رہتا ہے۔ یہ لاگت آپ کے job کی تعداد اور پولنگ کی فریکوئنسی کے ساتھ بڑھتی جاتی ہے۔
  • بہت زیادہ ماڈلز۔ میری ایپ کا ایک حصہ پہلے ہی RabbitMQ استعمال کر رہا تھا۔ باقی حصہ Hangfire استعمال کرتا تھا۔ اس کا مطلب تھا بیک گراؤنڈ کام کو مینیج کرنے کے دو مختلف طریقے تھے۔ RabbitMQ پر منتقل ہونے سے سب کچھ یکجا ہو گیا۔
  • لیٹنسی (Latency)۔ ایک broker کام کو پہنچتے ہی آگے بھیج دیتا ہے۔ Hangfire اگلی پولنگ کا انتظار کرتا ہے۔

فائدے اور نقصانات (The trade-offs):

Hangfire کو سیٹ اپ کرنا آسان ہے۔ یہ آپ کے موجودہ SQL ٹیبلز کا استعمال کرتا ہے۔ اس میں ایک بہترین بلٹ ان ڈیش بورڈ موجود ہے۔

RabbitMQ کے لیے ایک broker کو مینیج کرنے کی ضرورت ہوتی ہے۔ یہ ڈیٹا بیس CPU کے بجائے RAM اور نیٹ ورک کا استعمال کرتا ہے۔ آپ کو بہتر اسکیلنگ ملتی ہے، لیکن آپریشنل اوور ہیڈ (operational overhead) زیادہ ہوتا ہے۔

میں نے محفوظ طریقے سے کیسے مائیگریٹ کیا:

میں نے اپنے بزنس لاجک کو بالکل ویسا ہی رکھا۔ میں نے ہلکے پھلکے (thin) consumers بنائے جو ایک فرنٹ ڈور کے طور پر کام کرتے ہیں۔ کنزیومر میسج وصول کرتا ہے اور اسے موجودہ job class کے حوالے کر دیتا ہے۔

میں نے دو چیزوں پر توجہ دی:

  • ری ٹرائی پیرٹی (Retry parity)۔ میں نے RabbitMQ کنزیومر میں Hangfire کی ری ٹرائی سیٹنگز کو میچ کیا تاکہ میں میسجز نہ کھو دوں۔
  • اسکیمہ سیفٹی (Schema safety)۔ میں نے پرانے کالمز کو nullable رکھا تاکہ ڈیپلائمنٹ کے دوران ڈیٹا بیس خراب نہ ہو۔

میں نے کیا کھویا:

سب سے بڑا نقصان ویزیبلٹی (visibility) کا ہے۔ Hangfire آپ کو ایک فیل شدہ job پر کلک کرنے اور یہ دیکھنے کی اجازت دیتا ہے کہ اصل میں کیا ہوا تھا۔ RabbitMQ آپ کو دکھاتا ہے کہ Dead Letter Queue میں کتنے میسجز ہیں، لیکن یہ آپ کو ہر job کا وہی آسان ویو نہیں دیتا۔ اب میں ڈیش بورڈ کے بجائے اسٹرکچرڈ لاگز (structured logs) پر انحصار کرتا ہوں۔

میرا مشورہ:

Hangfire پر رہیں اگر:

  • آپ ایک واحد سروس چلاتے ہیں۔
  • آپ کی ٹیم چھوٹی ہے۔
  • آپ کو ڈی بگنگ کے لیے ایک آسان ڈیش بورڈ کی ضرورت ہے۔

RabbitMQ پر منتقل ہوں اگر:

  • آپ کی متعدد سروسز ہیں۔
  • پولنگ کی وجہ سے آپ کے ڈیٹا بیس پر بوجھ زیادہ ہے۔
  • آپ 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