ما هو Hangfire وما هي فوائده؟
Hangfire هي مكتبة قوية وشائعة للغة C# (.NET)، مصممة لتنفيذ المهام الخلفية (background jobs). في تطوير الويب الحديث، غالبًا ما نحتاج إلى تنفيذ عمليات لا يجب أن تعيق تدفق التنفيذ الرئيسي للتطبيق. على سبيل المثال: إرسال إشعارات البريد الإلكتروني، إنشاء التقارير، معالجة الملفات المرفوعة، مزامنة البيانات مع واجهات API الخارجية، تنظيف السجلات القديمة في قاعدة البيانات، وغيرها الكثير.
يوفر Hangfire طريقة بسيطة ومرنة لتشغيل هذه المهام. أبرز إمكانيات المكتبة:
- تنفيذ المهام في الخلفية: تُنفذ المهام بشكل غير متزامن دون حظر استجابة المستخدم.
- الجدولة: يمكن تشغيل المهام وفقًا لجدول زمني (تعبيرات Cron) أو مع تأخير.
- الموثوقية: يحفظ Hangfire معلومات المهام في مخزن دائم (قاعدة بيانات). حتى إذا تم إعادة تشغيل التطبيق، سيتم تنفيذ المهام غير المكتملة.
- المراقبة: واجهة ويب مدمجة (Dashboard) تتيح تتبع حالة المهام، عرض السجلات، وإعادة تشغيل المهام الفاشلة.
- إعادة المحاولة: إذا فشلت مهمة، يحاول Hangfire تلقائيًا تنفيذها مرة أخرى (بسياسة إعادة محاولة قابلة للتخصيص).
- التكامل مع حقن التبعيات (DI): يتكامل بسهولة مع حاويات حقن التبعيات في ASP.NET Core.
يدعم Hangfire مخازن بيانات متعددة: SQL Server، PostgreSQL، Redis، MongoDB، وغيرها. وهذا يجعله مناسبًا للمشاريع من أي حجم - من المواقع الصغيرة إلى الأنظمة المؤسسية عالية التحميل.
التثبيت
يتم تثبيت Hangfire عبر NuGet Package Manager. على عكس Python الذي يستخدم pip install، في بيئة .NET نستخدم dotnet add package أو مدير الحزم في Visual Studio.
لتثبيت الحزمة الأساسية لـ Hangfire، نفذ الأمر التالي في الطرفية (في المجلد الجذري لمشروعك):
dotnet add package Hangfire
سيقوم هذا الأمر بتثبيت نواة Hangfire والتبعيات اللازمة لتخزين المهام في الذاكرة (InMemory). للبيئة الإنتاجية، ستحتاج إلى تثبيت حزمة لقاعدة بيانات محددة، على سبيل المثال:
- SQL Server:
dotnet add package Hangfire.SqlServer - PostgreSQL:
dotnet add package Hangfire.PostgreSql - Redis:
dotnet add package Hangfire.Redis
بعد تثبيت الحزم، يجب تكوين Hangfire في ملف Program.cs (لـ ASP.NET Core) أو Startup.cs.
بداية سريعة
لنلقِ نظرة على مثال بسيط لتكوين واستخدام Hangfire في تطبيق ASP.NET Core.
الخطوة 1: التكوين في Program.cs
using Hangfire;
using Hangfire.SqlServer;
var builder = WebApplication.CreateBuilder(args);
// إضافة Hangfire مع مخزن SQL Server
builder.Services.AddHangfire(configuration => configuration
.SetDataCompatibilityLevel(CompatibilityLevel.Version_180)
.UseSimpleAssemblyNameTypeSerializer()
.UseRecommendedSerializerSettings()
.UseSqlServerStorage(builder.Configuration.GetConnectionString("HangfireConnection")));
// إضافة خادم Hangfire
builder.Services.AddHangfireServer();
var app = builder.Build();
// تفعيل لوحة التحكم (Dashboard)
app.UseHangfireDashboard();
// مثال لمهمة خلفية بسيطة
app.MapGet("/fire-and-forget", () =>
{
var jobId = BackgroundJob.Enqueue(() => Console.WriteLine("مرحبًا من Hangfire!"));
return $"تم إدراج المهمة {jobId} في قائمة الانتظار.";
});
app.Run();
الخطوة 2: إنشاء مهمة
في المثال أعلاه، استخدمنا طريقة BackgroundJob.Enqueue. هذا ينشئ مهمة من نوع "Fire-and-Forget" (أطلق وانسى).