مخطط المهام بلغة Go (Golang): من cron إلى asynq
في تطوير الخوادم الحديث بلغة Go (Golang)، غالبًا ما تنشأ الحاجة لتنفيذ كود وفقًا لجدول زمني أو بتأخير. تنظيف ذاكرة التخزين المؤقت، إرسال الإشعارات، إنشاء التقارير - كل هذا يتطلب مخطط مهام موثوقًا. في هذه المقالة، سنستعرض بالتفصيل ثلاث طرق شائعة: الحزمة القياسية cron، والمكتبة خفيفة الوزن gocron، وقائمة الانتظار الموزعة asynq. ستتعرف على الأداة التي تختارها لمشروعك على PythonLib.
1. cron القياسي لـ Go
مكتبة github.com/robfig/cron/v3 هي المعيار الفعلي لجدولة المهام المتكررة في Go. تستخدم صياغة تعبيرات cron المألوفة (5 حقول) وتدعم الثواني والمناطق الزمنية والتعافي من حالات الذعر (panic).
التثبيت ومثال أساسي
go get github.com/robfig/cron/v3مثال لمخطط يقوم بتشغيل مهمة كل 30 ثانية:
package main
import ( "fmt" "github.com/robfig/cron/v3")
func main() { c := cron.New() // إضافة مهمة بتعبير cron: كل 30 ثانية _, err := c.AddFunc("*/30 * * * * *", func() { fmt.Println("تم تنفيذ المهمة:", time.Now()) }) if err != nil { panic(err) } c.Start() // حظر goroutine الرئيسية select {}}الميزات الرئيسية:
- دعم تعبيرات cron القياسية (5 أو 6 حقول مع الثواني)
- الاسترداد التلقائي بعد حالة الذعر في المهمة
- إمكانية تعيين المنطقة الزمنية عبر
cron.WithLocation() - تسجيل الأحداث عبر
cron.WithLogger()
الاستخدام المتقدم: المهام المتسلسلة
c := cron.New(cron.WithSeconds())
// مهمة باسم للإدارةid, _ := c.AddFunc("@every 5m", func() { fmt.Println("يتم التنفيذ كل 5 دقائق")})
// حذف المهمة بواسطة المعرفc.Remove(id)
// إيقاف المخططc.Stop()المكتبة مثالية للمهام الدورية البسيطة داخل عملية واحدة. ومع ذلك، بالنسبة للأنظمة الموزعة (عدة نسخ مكررة من خادم Go)، ستكون هناك حاجة لقفل خارجي لمنع تنفيذ المهمة في وقت واحد على جميع العقد.
2. Gocron — جدولة خفيفة مع سلاسل
github.com/go-co-op/gocron تقدم واجهة برمجة تطبيقات أكثر حداثة بدون تعبيرات cron. بدلاً من السلاسل النصية، تستخدم سلاسل من الدوال. هذا مناسب بشكل خاص للمبتدئين.
مثال مع gocron
package main
import ( "fmt" "time" "github.com/go-co-op/gocron")
func main() { s := gocron.NewScheduler(time.UTC) // مهمة يتم تنفيذها كل دقيقتين _, _ = s.Every(2).Minutes().Do(func() { fmt.Println("مرت دقيقتان") }) // مهمة بتأخير بعد البدء _, _ = s.Every(1).Day().At("10:30").Do(func() { fmt.Println("يوميًا في الساعة 10:30") }) s.StartBlocking()}مزايا gocron:
- واجهة برمجة تطبيقات سهلة القراءة:
.Every(10).Seconds() - دعم مدمج للأقفال الموزعة عبر Redis (اختياري)
- إمكانية تعيين حد لعدد مرات التشغيل
- معالجات أخطاء عامة ومحلية
إذا كنت بحاجة إلى حل بسيط لخدمة مصغرة بدون تبعيات خارجية - فإن gocron سيكون خيارًا ممتازًا. إنه أخف من cron ولا يتطلب معرفة بصياغة تعبيرات cron.
3. Asynq — قائمة انتظار موزعة للمهام المؤجلة
github.com/hibiken/asynq ليس مجرد مخطط، بل هو نظام قوائم انتظار كامل يعتمد على Redis. يسمح بتأجيل المهام، وتعيين الأولويات، وإعادة تشغيل المهام الفاشلة، وتتبع حالتها عبر واجهة ويب.
بنية asynq
Asynq مع