Go (Golang) के लिए कार्य कतारें: पुस्तकालयों और उपकरणों के लिए पूर्ण मार्गदर्शिका
\n\nGo (Golang) पर आधुनिक विकास की दुनिया में, पृष्ठभूमि कार्यों और अतुल्यकालिक संचालन को संभालना एक महत्वपूर्ण कार्य है। चाहे वह ईमेल भेजना हो, रिपोर्ट तैयार करना हो, छवियों को संसाधित करना हो या बाहरी API के साथ इंटरैक्ट करना हो, कार्य कतारें (task queues) एप्लिकेशन के मुख्य थ्रेड को अनलोड करने और इसकी दोष सहनशीलता बढ़ाने की अनुमति देती हैं। इस लेख में, हम Go में कतारों के साथ काम करने के लिए सर्वश्रेष्ठ पुस्तकालयों, उनकी विशेषताओं और उपयोग के उदाहरणों पर विचार करेंगे।
\n\nकार्य कतार क्या है और इसकी आवश्यकता क्यों है?
\n\nकार्य कतार एक तंत्र है जो आपको संसाधन-गहन या लंबी अवधि के संचालन को पृष्ठभूमि में स्थगित करने की अनुमति देता है। मुख्य लाभ:
\n- \n
- अतुल्यकालिकता: उपयोगकर्ता भारी संचालन के पूरा होने की प्रतीक्षा नहीं करता है। \n
- स्केलिंग: आप समानांतर प्रसंस्करण के लिए कई वर्कर चला सकते हैं। \n
- दोष सहनशीलता: यदि कोई वर्कर विफल हो जाता है, तो कार्य कतार में रहता है और दूसरे द्वारा निष्पादित किया जाएगा। \n
- योजना: कार्यों का विलंबित प्रारंभ (उदाहरण के लिए, 1 घंटे के बाद)। \n
Go में कार्य कतारों के लिए शीर्ष-3 पुस्तकालय
\n\n1. Asynq
\n\nAsynq — Redis पर निर्मित वितरित कार्य कतारों के लिए एक आधुनिक, उच्च-प्रदर्शन और उपयोग में आसान पुस्तकालय है। Google टीम द्वारा विकसित और समुदाय द्वारा सक्रिय रूप से समर्थित।
\n\nमुख्य विशेषताएं:
\n- \n
- Redis के ऊपर काम करता है (संस्करण 6.0+ अनुशंसित)। \n
- विलंबित कार्यों (scheduled tasks) के लिए समर्थन। \n
- निगरानी के लिए अंतर्निहित वेब इंटरफ़ेस (Asynqmon)। \n
- विफल कार्यों के लिए डेड-लेटर कतार। \n
- तार्किक समूहीकरण के लिए कार्य समूह (task groups)। \n
- अनुकूलन योग्य पुनर्प्रयास नीति के साथ पुनर्प्रयास (Retry)। \n
उपयोग का उदाहरण:
\n\npackage main\n\nimport (\n "context"\n "fmt"\n "log"\n "time"\n\n "github.com/hibiken/asynq"\n)\n\n// कार्य प्रकार परिभाषित करें\nconst TypeEmailDelivery = "email:deliver"\n\n// कार्य के लिए डेटा संरचना\ntype EmailTaskPayload struct {\n UserID int\n TemplateID string\n}\n\n// कार्य हैंडलर\nfunc HandleEmailTask(ctx context.Context, t *asynq.Task) error {\n var payload EmailTaskPayload\n if err := json.Unmarshal(t.Payload(), &payload); err != nil {\n return fmt.Errorf("json.Unmarshal failed: %v: %w", err, asynq.SkipRetry)\n }\n log.Printf("Sending email to user %d with template %s", payload.UserID, payload.TemplateID)\n // यहां ईमेल भेजने का तर्क\n return nil\n}\n\nfunc main() {\n // कार्यों को कतार में रखने के लिए क्लाइंट\n client := asynq.NewClient(asynq.RedisClientOpt{Addr: "localhost:6379"})\n defer client.Close()\n\n // एक कार्य बनाएं\n payload, _ := json.Marshal(EmailTaskPayload{UserID: 42, TemplateID: "welcome"})\n task := asynq.NewTask(TypeEmailDelivery, payload, asynq.MaxRetry(5))\n\n // कार्य को कतार में रखें\n info, err := client.Enqueue(task, asynq.ProcessIn(10*time.Second)) // 10 सेकंड के लिए विलंब\n if err != nil {\n log.Fatal(err)\n }\n log.Printf("Task enqueued: ID=%s, Queue=%s", info.ID, info.Queue)\n\n // सर्वर-वर्कर\n srv := asynq.NewServer(\n asynq.RedisClientOpt{Addr: "localhost:6379"},\n asynq.Config{Concurrency: 10},\n )\n\n // हैंडलर पंजीकृत करें\n mux := asynq.NewServeMux()\n mux.HandleFunc(TypeEmailDelivery, HandleEmailTask)\n\n // वर्कर चलाएं\n if err := srv.Run(mux); err != nil {\n log.Fatal(err)\n }\n}\n\n\n2. Machinery
\n\nMachinery — Go के लिए सबसे लोकप्रिय और परिपक्व पुस्तकालयों में से एक है। यह कई ब्रोकरों का समर्थन करता है: Redis, AMQP (RabbitMQ), AWS SQS, MongoDB और अन्य। यह समृद्ध कार्यक्षमता और लचीलेपन से अलग है।
\n\nमुख्य विशेषताएं:
\n- \n
- समर्थन \n