Go (Golang) में Event Bus और Observer पैटर्न
Go (Golang) में आधुनिक विकास की दुनिया में, अक्सर एप्लिकेशन के घटकों के बीच शिथिल रूप से युग्मित इंटरैक्शन को व्यवस्थित करने की आवश्यकता होती है। दो क्लासिक दृष्टिकोण हैं — Observer पैटर्न और इसका अधिक उन्नत कार्यान्वयन — Event Bus (इवेंट बस)। ये तंत्र प्रोग्राम के कुछ हिस्सों को दूसरों के कार्यों पर प्रतिक्रिया करने की अनुमति देते हैं, बिना कठोर निर्भरता पैदा किए।
इस लेख में, हम चर्चा करेंगे कि बाहरी निर्भरता के बिना शुद्ध Go पर Event Bus को कैसे लागू किया जाए, Observer पैटर्न पर विचार करेंगे, और सिंक्रोनस और एसिंक्रोनस इवेंट प्रोसेसिंग के लिए कोड उदाहरण दिखाएंगे।
Observer पैटर्न क्या है?
Observer (प्रेक्षक) पैटर्न एक व्यवहारिक डिज़ाइन पैटर्न है जो सब्सक्रिप्शन का एक तंत्र बनाता है, जो एक वस्तु को दूसरी वस्तुओं में होने वाली घटनाओं पर नज़र रखने और प्रतिक्रिया करने की अनुमति देता है।
मुख्य तत्व:
- Subject (विषय) — वह वस्तु जो घटनाएँ उत्पन्न करती है।
- Observer (प्रेक्षक) — वह वस्तु जो घटनाओं की सदस्यता लेती है।
- Event (घटना) — डेटा जो विषय से प्रेक्षकों को प्रेषित किया जाता है।
Event Bus क्या है?
Event Bus एक केंद्रीकृत बस है जो प्रकाशकों (publishers) और सदस्यों (subscribers) के बीच घटनाओं के स्थानांतरण का प्रबंधन करती है। क्लासिक Observer के विपरीत, जहां विषय सीधे प्रेक्षकों की सूची संग्रहीत करता है, Event Bus एक मध्यस्थ के रूप में कार्य करता है। यह सिस्टम को और अधिक लचीला और स्केलेबल बनाता है।
Go पर Event Bus का कार्यान्वयन
Go में Event Bus का अंतर्निहित कार्यान्वयन नहीं है, लेकिन इसे goroutines, channels और interfaces का उपयोग करके आसानी से लिखा जा सकता है। आइए एक सरल लेकिन पूर्ण कार्यान्वयन पर विचार करें।
1. बुनियादी प्रकार परिभाषित करना
// Event एक घटना संरचना का प्रतिनिधित्व करता हैtype Event struct { Name string Data interface{}}
// EventHandler — घटना हैंडलर फ़ंक्शनtype EventHandler func(Event)2. Event Bus बनाना
type EventBus struct { handlers map[string][]EventHandler mu sync.RWMutex}
// NewEventBus एक नई इवेंट बस बनाता हैfunc NewEventBus() *EventBus { return &EventBus{ handlers: make(map[string][]EventHandler), }}
// Subscribe एक हैंडलर को किसी घटना की सदस्यता देता हैfunc (eb *EventBus) Subscribe(name string, handler EventHandler) { eb.mu.Lock() defer eb.mu.Unlock() eb.handlers[name] = append(eb.handlers[name], handler)}
// Publish सिंक्रोनस रूप से एक घटना प्रकाशित करता हैfunc (eb *EventBus) Publish(name string, data interface{}) { eb.mu.RLock() defer eb.mu.RUnlock() if handlers, ok := eb.handlers[name]; ok { event := Event{Name: name, Data: data} for _, handler := range handlers { handler(event) } }}3. एसिंक्रोनस प्रकाशन
एसिंक्रोनस प्रोसेसिंग के लिए, प्रत्येक हैंडलर को एक अलग goroutine में चलाया जा सकता है:
// PublishAsync एसिंक्रोनस रूप से एक घटना प्रकाशित करता हैfunc (eb *EventBus) PublishAsync(name string, data interface{}) { eb.mu.RLock() defer eb.mu.RUnlock() if handlers, ok := eb.handlers[name]; ok { event := Event{Name: name, Data: data} for _, handler := range handlers { go handler(event) } }}उपयोग का उदाहरण
आइए देखें कि वास्तविक एप्लिकेशन में हमारे Event Bus का उपयोग कैसे करें। मान लीजिए कि हमारे पास एक सिस्टम है जो उपयोगकर्ता क्रियाओं को लॉग करता है और सूचनाएँ भेजता है।
func main() { bus := NewEventBus()
// "user.login" घटना की सदस्यता लेना bus.Subscribe("user.login", func(e Event) { userData := e.Data.(map[string]string) fmt.Printf("लॉग: उपयोगकर्ता %s ने सिस्टम में प्रवेश किया", userData["username"]) })
// उसी घटना की सदस्यता लेना