Go (Golang) के लिए कार्य कतारें: अवलोकन और अभ्यास
आधुनिक वेब एप्लिकेशन और माइक्रोसर्विसेज में, अक्सर संसाधन-गहन या लंबी अवधि के संचालन को एसिंक्रोनस रूप से करने की आवश्यकता होती है: ईमेल भेजना, रिपोर्ट जनरेट करना, इमेज प्रोसेसिंग, बाहरी API के साथ इंटरैक्शन। इन उद्देश्यों के लिए कार्य कतारों (task queues) का उपयोग किया जाता है। Go (Golang) इकोसिस्टम में कई परिपक्व लाइब्रेरीज़ हैं जो ऐसी आर्किटेक्चर को लागू करने की अनुमति देती हैं। इस लेख में, हम तीन सबसे लोकप्रिय टूल्स पर विचार करेंगे: machinery, gocelery और asynq, उनकी विशेषताओं का विश्लेषण करेंगे और कोड उदाहरण प्रदान करेंगे।
Go में कार्य कतार की आवश्यकता क्यों है?
कार्य कतार कई प्रमुख समस्याओं का समाधान करती है:
- जिम्मेदारी का विभाजन: HTTP हैंडलर बैकग्राउंड कार्य के पूरा होने की प्रतीक्षा नहीं करता।
- स्केलिंग: आप विभिन्न सर्वरों पर कई वर्कर (worker) चला सकते हैं।
- विश्वसनीयता: वर्कर की विफलता पर कार्य खोता नहीं है और इसे पुनः संसाधित किया जा सकता है।
- शेड्यूलिंग: कार्य को एक निश्चित समय पर निष्पादित करने में देरी करने की क्षमता।
1. Machinery — शक्तिशाली और लचीली लाइब्रेरी
Machinery Go के लिए एक एसिंक्रोनस कार्य कतार है, जिसे शुरू से लिखा गया है। यह कई ब्रोकरों (Redis, RabbitMQ, AWS SQS) और परिणाम भंडारण (Redis, MongoDB, Memcache) का समर्थन करता है। Machinery कार्यों, श्रृंखलाओं (chains), समूहों (groups) और आवर्ती कार्यों को बनाने के लिए एक समृद्ध API प्रदान करता है।
स्थापना और उदाहरण
go get github.com/RichardKnox/machinery/v2एक सरल वर्कर और क्लाइंट का उदाहरण:
package main
import ( "github.com/RichardKnox/machinery/v2" "github.com/RichardKnox/machinery/v2/config" "github.com/RichardKnox/machinery/v2/tasks")
func main() { // Redis ब्रोकर के साथ कॉन्फ़िगरेशन cnf := &config.Config{ Broker: "redis://localhost:6379", DefaultQueue: "machinery_tasks", ResultBackend: "redis://localhost:6379", }
server, err := machinery.NewServer(cnf) if err != nil { panic(err) }
// कार्य का पंजीकरण err = server.RegisterTasks(map[string]interface{}{ "add": func(a, b int) (int, error) { return a + b, nil }, }) if err != nil { panic(err) }
// वर्कर लॉन्च करना worker := server.NewWorker("worker1", 2) // 2 concurrent tasks go worker.Launch()
// कार्य भेजना task := tasks.Signature{ Name: "add", Args: []tasks.Arg{ {Type: "int", Value: 5}, {Type: "int", Value: 7}, }, } result, _ := server.SendTask(&task) // परिणाम की प्रतीक्षा if res, err := result.Get(10); err == nil { println("Result:", res.(int)) // Output: 12 }}लाभ: जटिल कार्य ग्राफ का समर्थन, पुनः प्रयास की संभावना, वेब इंटरफ़ेस के माध्यम से निगरानी।
नुकसान: अपेक्षाकृत जटिल सेटअप, दस्तावेज़ीकरण कभी-कभी कोड से पीछे रह जाता है।
2. Asynq — समृद्ध UI के साथ आधुनिक कतार
Asynq Google के डेवलपर्स द्वारा बनाई गई एक लाइब्रेरी है, जो Redis पर आधारित है। यह एक सुविधाजनक API, अंतर्निहित शेड्यूलिंग, कार्य प्राथमिकताएँ और निगरानी के लिए एक अंतर्निहित वेब इंटरफ़ेस प्रदान करती है। Asynq सक्रिय रूप से विकसित हो रही है और इसमें उत्कृष्ट दस्तावेज़ीकरण है।
स्थापना और उदाहरण
go get github.com/hibiken/asynqएक सरल क्लाइंट और वर्कर का उदाहरण:
package main
import ( "context" "log" "github.com/hibiken/asynq")
// टाइपिफाइड कार्यconst TypeEmailDelivery = "email:deliver"
func main() { // कार्य भेजने के लिए क्लाइंट client := asynq.NewClient(asynq.RedisClientOpt{Addr: "localhost:6379"}) defer client.Clos