Go (Golang) में कार्य शेड्यूलर: cron से asynq तक
Go (Golang) में आधुनिक सर्वर-साइड डेवलपमेंट में, अक्सर शेड्यूल या विलंब के साथ कोड निष्पादित करने की आवश्यकता होती है। कैश साफ़ करना, सूचनाएं भेजना, रिपोर्ट तैयार करना - इन सबके लिए एक विश्वसनीय कार्य शेड्यूलर की आवश्यकता होती है। इस लेख में, हम तीन लोकप्रिय दृष्टिकोणों पर विस्तार से चर्चा करेंगे: मानक पैकेज cron, हल्की लाइब्रेरी gocron, और वितरित कतार asynq। आप जानेंगे कि PythonLib पर अपने प्रोजेक्ट के लिए कौन सा टूल चुनना है।
1. Go के लिए मानक cron
लाइब्रेरी github.com/robfig/cron/v3 Go में आवर्ती कार्यों को शेड्यूल करने के लिए वास्तविक मानक है। यह परिचित cron-एक्सप्रेशन सिंटैक्स (5 फ़ील्ड) का उपयोग करता है और सेकंड, टाइम ज़ोन और पैनिक से रिकवरी का समर्थन करता है।
स्थापना और मूल उदाहरण
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() // main गोरूटीन को ब्लॉक करें select {}}मुख्य विशेषताएं:
- मानक cron-एक्सप्रेशन का समर्थन (5 या 6 फ़ील्ड सेकंड के साथ)
- कार्य में पैनिक के बाद स्वचालित पुनर्प्राप्ति
cron.WithLocation()के माध्यम से टाइम ज़ोन सेट करने की क्षमताcron.WithLogger()के माध्यम से लॉगिंग
उन्नत उपयोग: चेन जॉब्स
c := cron.New(cron.WithSeconds())
// प्रबंधन के लिए नाम वाला कार्यid, _ := c.AddFunc("@every 5m", func() { fmt.Println("हर 5 मिनट में निष्पादित हो रहा है")})
// ID द्वारा कार्य हटानाc.Remove(id)
// शेड्यूलर रोकनाc.Stop()यह लाइब्रेरी एक ही प्रक्रिया के भीतर सरल आवधिक कार्यों के लिए आदर्श है। हालांकि, वितरित सिस्टम (Go सर्वर की कई प्रतिकृतियां) के लिए, कार्य को सभी नोड्स पर एक साथ निष्पादित होने से रोकने के लिए बाहरी लॉकिंग की आवश्यकता होगी।
2. Gocron — चेन के साथ हल्का शेड्यूलर
github.com/go-co-op/gocron cron-एक्सप्रेशन के बिना एक अधिक आधुनिक API प्रदान करता है। स्ट्रिंग के बजाय, आप मेथड चेन का उपयोग करते हैं। यह शुरुआती लोगों के लिए विशेष रूप से सुविधाजनक है।
gocron के साथ उदाहरण
package main
import ( "fmt" "time" "github.com/go-co-op/gocron")
func main() { s := gocron.NewScheduler(time.UTC) // कार्य हर 2 मिनट में निष्पादित होता है _, _ = s.Every(2).Minutes().Do(func() { fmt.Println("2 मिनट बीत गए") }) // शुरू होने के बाद विलंब वाला कार्य _, _ = s.Every(1).Day().At("10:30").Do(func() { fmt.Println("प्रतिदिन 10:30 बजे") }) s.StartBlocking()}gocron के लाभ:
- मानव-पठनीय API:
.Every(10).Seconds() - Redis के माध्यम से वितरित लॉकिंग के लिए अंतर्निहित समर्थन (वैकल्पिक)
- रन की संख्या पर सीमा निर्धारित करने की क्षमता
- वैश्विक और स्थानीय त्रुटि हैंडलर
यदि आपको बाहरी निर्भरता के बिना माइक्रोसर्विस के लिए एक सरल समाधान चाहिए - gocron एक उत्कृष्ट विकल्प होगा। यह cron से हल्का है और cron-एक्सप्रेशन सिंटैक्स के ज्ञान की आवश्यकता नहीं है।
3. Asynq — विलंबित कार्यों की वितरित कतार
github.com/hibiken/asynq केवल एक शेड्यूलर नहीं है, बल्कि Redis पर आधारित एक पूर्ण कतार प्रणाली है। यह कार्यों को विलंबित करने, प्राथमिकताएं निर्धारित करने, विफल कार्यों को दोहराने और वेब इंटरफ़ेस के माध्यम से उनकी स्थिति को ट्रैक करने की अनुमति देता है।
asynq की आर्किटेक्चर
Asynq सो