Go (Golang) के लिए कार्य कतारें: उपकरणों का अवलोकन और तुलना
आधुनिक वेब डेवलपमेंट और Go (Golang) पर उच्च-लोड सेवाओं के निर्माण में, HTTP अनुरोधों की मुख्य प्रक्रिया के बाहर, कार्यों को एसिंक्रोनस रूप से निष्पादित करने की आवश्यकता लगभग हमेशा उत्पन्न होती है। ईमेल सूचनाएं भेजना, PDF रिपोर्ट तैयार करना, छवियों को संसाधित करना, बाहरी API के साथ इंटरैक्ट करना - इन सबको पृष्ठभूमि प्रक्रियाओं में ले जाने की आवश्यकता होती है। यहीं पर कार्य कतारें (task queues) सहायक होती हैं।
कार्य कतार एक तंत्र है जो किसी ऑपरेशन के निष्पादन को स्थगित करने, विफलता की स्थिति में इसके पुन: प्रसंस्करण की गारंटी देने और कई वर्कर्स के बीच लोड को संतुलित करने की अनुमति देता है। Go पारिस्थितिकी तंत्र में इस समस्या को हल करने के लिए कई परिपक्व और सक्रिय रूप से विकसित होने वाली पुस्तकालयें मौजूद हैं। इस लेख में, हम तीन सबसे लोकप्रिय दृष्टिकोणों पर विस्तार से चर्चा करेंगे: Asynq, Machinery और सीधे Redis Streams के साथ काम करना।
1. Asynq: Redis पर आधारित सरलता और शक्ति
डेवलपर hibiken का Asynq, वर्तमान में Go में कार्य कतारों के लिए शायद सबसे लोकप्रिय पुस्तकालय है। यह Redis के ऊपर बनाया गया है और 'बॉक्स से बाहर' समृद्ध कार्यक्षमता प्रदान करता है।
Asynq की मुख्य विशेषताएं:
- निगरानी: कतारों, कार्य निष्पादन और त्रुटियों को ट्रैक करने के लिए अंतर्निहित वेब इंटरफ़ेस (Asynqmon)।
- शेड्यूलिंग: किसी कार्य को एक निश्चित समय पर निष्पादित करने में देरी करने की क्षमता (cron-like सिंटैक्स)।
- प्राथमिकताएं: विभिन्न प्राथमिकताओं वाली कई कतारों के लिए समर्थन।
- Retry और Dead Letters: स्वचालित पुन: प्रयास और अक्षम्य कार्यों के लिए 'डेड लेटर' कतार।
- Middleware: लॉगिंग, मेट्रिक्स आदि के लिए मध्यवर्ती सॉफ़्टवेयर के लिए समर्थन।
Asynq के उपयोग का उदाहरण:
package main
import ( "context" "log" "time" "github.com/hibiken/asynq")
// कार्य प्रकार परिभाषित करेंconst TypeEmailDelivery = "email:deliver"
// कार्य भेजने के लिए क्लाइंटfunc main() { client := asynq.NewClient(asynq.RedisClientOpt{Addr: "localhost:6379"}) defer client.Close()
// एक कार्य बनाएं task, err := asynq.NewTask(TypeEmailDelivery, []byte(`{"user_id": 42, "template": "welcome"}`)) if err != nil { log.Fatal(err) }
// 5 मिनट की देरी से कार्य भेजें info, err := client.Enqueue(task, asynq.ProcessIn(5*time.Minute)) if err != nil { log.Fatal(err) } log.Printf("कार्य [%s] कतार में रखा गया", info.ID)}
// कार्यों को संसाधित करने के लिए वर्करfunc handler(ctx context.Context, t *asynq.Task) error { log.Printf("कार्य संसाधित किया जा रहा है: %s", t.Type()) // यहाँ ईमेल भेजने का तर्क return nil}
func startWorker() { srv := asynq.NewServer( asynq.RedisClientOpt{Addr: "localhost:6379"}, asynq.Config{Concurrency: 10}, )
mux := asynq.NewServeMux() mux.HandleFunc(TypeEmailDelivery, handler)
if err := srv.Run(mux); err != nil { log.Fatal(err) }}Asynq उन अधिकांश प्रोजेक्ट्स के लिए आदर्श है जहाँ पहले से Redis का उपयोग किया जाता है। इसे सेट करना आसान है और डेवलपर के लिए एक उत्कृष्ट UX प्रदान करता है।
2. Machinery: ब्रोकर्स के साथ वितरित कार्य
Machinery एक पुरानी, लेकिन बहुत शक्तिशाली पुस्तकालय है, जो Python पुस्तकालय Celery से प्रेरित है। Asynq के विपरीत, Machinery Redis से कठोर रूप से बंधा नहीं है और कई संदेश ब्रोकर्स का समर्थन करता है: Redis, RabbitMQ, AWS SQS और Memory।
Machinery की मुख्य विशेषताएं:
- ब्रोकर लचीलापन: विभिन्न संदेश ब्रोकर्स के बीच आसानी से स्विच करें।
- कार्य परिणाम: कार्य निष्पादन के परिणामों को सहेजने और प्राप्त करने के लिए अंतर्निहित समर्थन (उदाहरण के लिए, Redis में)।