قوائم المهام لـ Go (Golang): دليل شامل للمكتبات والأدوات
في عالم التطوير الحديث بلغة Go (Golang)، تعد معالجة مهام الخلفية والعمليات غير المتزامنة مهمة بالغة الأهمية. سواء كان الأمر يتعلق بإرسال البريد الإلكتروني، أو إنشاء التقارير، أو معالجة الصور، أو التفاعل مع واجهات برمجة التطبيقات (API) الخارجية، فإن قوائم المهام (task queues) تسمح بتخفيف العبء عن مسار التطبيق الرئيسي وزيادة تحمله للأخطاء. في هذه المقالة، سنستعرض أفضل المكتبات للعمل مع قوائم الانتظار في Go، وميزاتها وأمثلة على استخدامها.
ما هي قائمة المهام ولماذا نحتاجها؟
قائمة المهام هي آلية تسمح بتأجيل تنفيذ العمليات كثيفة الاستخدام للموارد أو الطويلة في الخلفية. المزايا الرئيسية:
- عدم التزامن: لا ينتظر المستخدم اكتمال العملية الثقيلة.
- قابلية التوسع: يمكنك تشغيل العديد من العمال (workers) للمعالجة المتوازية.
- تحمل الأخطاء: إذا تعطل أحد العمال، تبقى المهمة في قائمة الانتظار وسيتم تنفيذها بواسطة عامل آخر.
- الجدولة: تشغيل المهام المؤجلة (على سبيل المثال، بعد ساعة واحدة).
أفضل 3 مكتبات لقوائم المهام في Go
1. Asynq
Asynq هي مكتبة حديثة وعالية الأداء وسهلة الاستخدام لقوائم المهام الموزعة، مبنية على Redis. تم تطويرها بواسطة فريق Google ويتم دعمها بنشاط من قبل المجتمع.
الميزات الرئيسية:
- تعمل فوق Redis (يوصى بالإصدار 6.0+).
- دعم المهام المجدولة (scheduled tasks).
- واجهة ويب مدمجة للمراقبة (Asynqmon).
- قائمة انتظار الرسائل الميتة (Dead-letter queue) للمهام الفاشلة.
- مجموعات المهام (task groups) للتجميع المنطقي.
- إعادة المحاولة (Retry) بسياسة قابلة للتخصيص.
مثال على الاستخدام:
package main
import ( "context" "fmt" "log" "time"
"github.com/hibiken/asynq")
// تعريف نوع المهمةconst TypeEmailDelivery = "email:deliver"
// هيكل بيانات المهمةtype EmailTaskPayload struct { UserID int TemplateID string}
// معالج المهمةfunc HandleEmailTask(ctx context.Context, t *asynq.Task) error { var payload EmailTaskPayload if err := json.Unmarshal(t.Payload(), &payload); err != nil { return fmt.Errorf("json.Unmarshal failed: %v: %w", err, asynq.SkipRetry) } log.Printf("إرسال بريد إلكتروني إلى المستخدم %d باستخدام القالب %s", payload.UserID, payload.TemplateID) // هنا منطق إرسال البريد الإلكتروني return nil}
func main() { // عميل لإضافة المهام client := asynq.NewClient(asynq.RedisClientOpt{Addr: "localhost:6379"}) defer client.Close()
// إنشاء مهمة payload, _ := json.Marshal(EmailTaskPayload{UserID: 42, TemplateID: "welcome"}) task := asynq.NewTask(TypeEmailDelivery, payload, asynq.MaxRetry(5))
// إضافة المهمة إلى قائمة الانتظار info, err := client.Enqueue(task, asynq.ProcessIn(10*time.Second)) // تأجيل لمدة 10 ثوانٍ if err != nil { log.Fatal(err) } log.Printf("تمت إضافة المهمة: ID=%s, Queue=%s", info.ID, info.Queue)
// خادم العامل srv := asynq.NewServer( asynq.RedisClientOpt{Addr: "localhost:6379"}, asynq.Config{Concurrency: 10}, )
// تسجيل المعالج mux := asynq.NewServeMux() mux.HandleFunc(TypeEmailDelivery, HandleEmailTask)
// تشغيل العامل if err := srv.Run(mux); err != nil { log.Fatal(err) }}2. Machinery
Machinery هي واحدة من أشهر وأقدم المكتبات لـ Go. تدعم عدة وسطاء (brokers): Redis، AMQP (RabbitMQ)، AWS SQS، MongoDB وغيرها. تتميز بوظائف غنية ومرونة عالية.
الميزات الرئيسية:
- دعم